Скрыть символ (ы) в общем объекте из 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 в список зависимых библиотек, разделенных пробелами.)

Другие вопросы по тегам