2015-01-06 3 views
0

Я на AIX 5.3, работая с C.Сделать AIX загружать все общие символы во время выполнения?

У меня есть приложение (foo), которое ссылается в общей библиотеке (lib1.so) во время выполнения, а затем динамически загружает другую библиотеку (lib2.so) через dlopen(). lib2.so использует некоторые функции в lib1.so, что foo не использует. Когда я запустить приложение, я получаю сообщение об ошибке, подобное:

rtld: 0712-001 Symbol someLibFunc was referenced from module 
/libdir/lib2.so(), but a runtime definition of the symbol was not found. 

Я не верю, что изменение dlopen() флаги будут иметь никакого эффекта, так как мой вопрос, кажется, что-то делать с тем, что символы импортируется, когда происходит привязка времени выполнения. Есть ли какой-либо тип ld, который я могу использовать при создании foo, чтобы заставить его импортировать все общие символы библиотеки? Эта же конструкция отлично работает в моей Linux-среде.

+1

Дикое предположение: может быть, система кэшировала старую версию lib1.so, которая не содержала функцию? (Запуск 'slibclean'?) – Inspired

+0

Я разработчик для крупной компании, и slibclean не доступен в наших AIX-блоках, к сожалению (я не знаю почему). Тем не менее, я разработал совместно используемые библиотеки в прошлом без проблем кэширования, поэтому я не думаю, что это преступник. – stevenmalin

ответ

0

Я нашел преступника.

я побежал «свалку -tv» на lib1.so и обнаружил, что функция, которую я ожидал, чтобы быть экспортирован была не там (хотя было отображаться в нм, как ни странно). Библиотека была связана с -bexpall, поэтому все символы должны быть там. Я углубился в страницу ld man и увидел, что expall сделал не символы экспорта с префиксом подчеркивания (_). Функция, которую я пыталась использовать, начиналась с подчеркивания. Я нашел опцию «expfull» ld, которая экспортирует символы с префиксом подчеркивания, перестраивает lib1.so с этой опцией, и теперь все хорошо.

+0

Вы также можете сделать список символов экспорта в файле и использовать его с опцией -bexport. Это не так сложно, и у вас больше контроля. – pedz

+0

Да, я использовал это раньше. В этом конкретном случае я хочу, чтобы все доступные функции экспортировались, поэтому exfull делает трюк. – stevenmalin

Смежные вопросы