LINUX.ORG.RU

Проблема с линковкой динамической библиотеки


0

0

Привет всем. Я новичкок в программировании под Linux и в процессе работы у меня возникла следующую проблема. При построении исполняемого файла понадобилось использовать динамическую либу (-Bdynamic /path/module.so). При переносе на целевую систему и просмотре модуля с помощью команды ldd видно что модуль жестко привязан к расположению этой библиотеки. Соответсвенно программа не работает, так как на целевой системе module.so расположен в другом месте. Можно ли как-нибудь настроить построение модуля чтобы module.so искался не жестко зашитому пути, а в стандартных типа /usr/lib, /lib или прописанных в переменной LD_LIBRARY_PATH.

Спасибо

anonymous

А зачем "-Bdynamic /path/module.so"? Разве "-L/path -lmodule" с последующим положением либы в общесистемное место не прокатит? Если нет, то dlsym + конфиг на тему "а куда либка свалена".

Gharik
()
Ответ на: комментарий от ananas

Разумеется, так и именуют обычно. Например модули для Imlib - сваливаются вместе с основной либкой в /usr/local/lib.

Gharik
()
Ответ на: комментарий от anonymous

Я наверное не очень подробно объяснил проблему. Попробую заново. Есть сторониий продукт (для любопытных VMware ESX Server), для которого пишется приложение которое использует модуль расширения Perl поставляемый с этим продуктом (VmPerl.so). У нас в компании существует собственная система построения билдов которую я изменить не могу. Я копирую VmPerl.so в эту систему и строю исполняемый файл. Соответсвенно возникают вышеописанные проблемы (путь по которому он лежит в системе построения билдов жестко прописывается в исполняемом файле). Расположить файл также как в исходной системе не очень удобно, так как в разных версиях ESX Server этот путь слегка отличается. Собственно еще раз вопрос: как собрать исполняемый файл чтобы он не содержал жесткую привязку к местоположению, а искал в стандартных директориях типа /lib, /usr/lib и прописанных в LD_LIBRARY_PATH?

anonymous
()
Ответ на: комментарий от anonymous

попробуй просто убрать -Bdinamic

собирай все динамически, а если нужно чтото включить статически - через -Bstatic в конце команды

ananas ★★★★★
()
Ответ на: комментарий от kosmonavt

Т.е., если я правильно понял, нужно слинковать VmPerl.so, который лежит в путях LD_LIBRARY_PATH.

1-й вариант) перед линковкой копируете VmPerl.so или делаете на него симлинк в текущий каталог сборки, чтобы избавиться от имени каталога. Дальше сборка

gcc blah-blah -Wl,-Bdynamic,VmPerl.so blah-blah

2) на VmPerl.so делаете симлинк с именем libVmPerl.so в каталог, в котором лежат ваши библиотеки

gcc blah-blah -Lmy_lib_path -lVmPerl blah-blah

Во время установки/конфигурирования приложения находите VmPerl.so, делаете на него симлинк libVmPerl.so в один из каталогов LD_LIBRARY_PATH.

3) Можно написать скрипт, в котором перед запуском проги дописать к LD_LIBRARY_PATH нужный каталог.

И т.д. и т.п

kosmonavt
()

Елы-палы, совсем забыл, заработавшись зело...

Есть LD_PRELOAD.

Gharik
()
Ответ на: комментарий от kosmonavt

Всем спасибо за советы. Отдельное спасибо kosmonavt, воспользовался 1 вариантом

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.