Скрыть символ (ы) в общем объекте из LD
У меня есть две сторонние библиотеки, которые иногда экспортируют одно и то же имя символа. Когда исполняемый файл загружен, ld обычно выбирает неправильный, и в результате я получаю сбой. Я не могу сделать слишком много с содержанием этих библиотек, так что, может быть, есть способ научить, как найти правильную реализацию?
ОС - Solaris 10, моя программа построена с помощью autoconf/autotools/gcc, конфликтующие библиотеки - libclntsh (часть драйвера Oracle) и OpenLDAP. К сожалению, я не могу использовать реализацию Oracle клиента LDAP - ему не хватает многих функций, которые есть в OpenLDAP.
Отредактировано: связь следующая: libclntsh.so->A.so->MAIN <-B.so <-libldap_r.so
2 ответа
Если вам не нужно ссылаться в обеих общих библиотеках во время компиляции (что не ясно из вашего вопроса), вы можете использовать -Bdirect
для общей библиотеки. Это будет записывать для всех символов из общей библиотеки, где они были найдены; если затем во время выполнения появится второе определение символа (из другой общей библиотеки), оно будет проигнорировано.
Одним из решений является установка LD_PRELOAD
переменная окружения для библиотеки, символы которой должны иметь приоритет. (Если эта библиотека имеет собственные зависимости общей библиотеки, вам может потребоваться предварительно загрузить все ее зависимости; просто установите LD_PRELOAD
в список зависимых библиотек, разделенных пробелами.)