Скрыть символ (ы) в общем объекте из LD - PullRequest
8 голосов
/ 02 декабря 2008

У меня есть две сторонние библиотеки, которые иногда экспортируют одно и то же имя символа. Когда исполняемый файл загружен, ld обычно выбирает неправильный, и в результате я получаю сбой. Я не могу сделать слишком много с содержанием этих библиотек, так что может быть есть способ научить ld , как найти правильную реализацию?

ОС - Solaris 10, моя программа построена с помощью autoconf / autotools / gcc, конфликтующие библиотеки libclntsh (часть драйвера Oracle) и OpenLDAP. К сожалению, я не могу использовать реализацию Oracle клиента LDAP - ему не хватает многих функций, которые есть в OpenLDAP.

Отредактировано: Связь следующая: libclntsh.so-> A.so-> MAIN <-B.so <-libldap_r.so </p>

Ответы [ 2 ]

10 голосов
/ 02 декабря 2008

Если вам не нужно ссылаться в обеих общих библиотеках во время компиляции (что не ясно из вашего вопроса), вы можете использовать -Bdirect для общей библиотеки. Это будет записывать для всех символов из общей библиотеки, где они были найдены; если затем во время выполнения появится второе определение символа (из другой общей библиотеки), оно будет проигнорировано.

4 голосов
/ 02 декабря 2008

Одним из решений является установка переменной среды LD_PRELOAD для библиотеки, символы которой должны иметь приоритет. (Если эта библиотека имеет собственные зависимости общей библиотеки, вам может потребоваться предварительно загрузить все ее зависимости; просто установите LD_PRELOAD в список зависимых библиотек, разделенных пробелами.)

...