Скрыть символ в общем объекте от LD

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

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

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

Ответ 1

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

Ответ 2

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