2008-12-02 5 views
8

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

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

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

+0

Привет, Дмитрий. Посмотрите [мой вопрос] (http://stackoverflow.com/questions/9909528/how-can-i-remove-a-symbol-from-a-shared-object). По-видимому, вы можете использовать [`objcopy -N foo`] (http://linux.about.com/library/cmd/blcmdl1_objcopy.htm) для удаления символов общего объекта. – 2012-03-28 14:40:16

ответ

10

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

4

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