Как изменить в библиотеке путь к бинарному файлу из bash? - PullRequest
1 голос
/ 04 февраля 2011

У меня правильно установлено программное обеспечение на Kubuntu.

Теперь я исправляю и тестирую некоторые из его библиотек.

Как я могу запустить программу из bash, чтобы она загружала мои пропатченные библиотеки вместо официальных библиотек?

например:.
официальные библиотеки находятся в / usr / lib /
мои библиотеки исправлений (используемые при разработке тестов) находятся в / home / user / dev / lib /

Я пытался:

$ set LD_LIBRARY_PATH=/home/user/dev/lib/  
$ binary_app &

но безрезультатно.

Я бы предпочел решение, которое можно установить из bash, но если это невозможно, я также мог бы изменить файл cmake этого программного обеспечения C ++.

Цель состоит в том, чтобы я мог легко запустить приложение либо с ванильными библиотеками, либо с моими исправленными библиотеками, чтобы увидеть различия.

Редактировать: это KDE .so файл

Библиотека, которую я тестирую, является библиотекой KDE4. Официальная библиотека находится в / usr / lib / kde4 /. В этом каталоге ни одна из библиотек не начинается с префикса lib .

Буду ли я:

/lib/ld-linux-x86-64.so.2 --list  --library-path PATH EXEC  

или

ldd EXEC  

Библиотека вообще не указана.

С другой стороны, если переместить исходную библиотеку из / usr / lib / kde4 /, приложение запускается, но соответствующая функциональность отсутствует.

Библиотеки KDE4 загружаются определенным образом? Может быть, переменная для установки отличается ...

Редактировать 2

Все ответы хорошие и полезные ... к сожалению, оказалось, что проблема не связана с настройкой пути к lib. Я имею дело с архитектурой плагинов, и путь загрузки .so кажется жестко заданным где-то в приложении. Мне нужно больше времени проводить в исходном коде, чтобы понять, что происходит ... Спасибо и +1 всем.

Ответы [ 5 ]

7 голосов
/ 04 февраля 2011

Из 'man bash':

Когда простая команда, отличная от встроенной функции или функции оболочки, должна выполняется, он вызывается в отдельная среда выполнения, которая состоит из следующего. Если не в противном случае значения наследуется от скорлупы.

[....]

· переменные оболочки и функции, помеченные для экспорта, вместе с переменными, экспортированными для команда, переданная в среде

Вам необходимо «экспортировать» переменную, если она будет видна выполняемым вами программам.

Однако вы также можете попробовать следующее:

/ lib / ld-linux.so.2 --library-path PATH EXECUTABLE

См. http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

5 голосов
/ 04 февраля 2011

Попробуйте export LD_LIBRARY_PATH=... вместо набора.

3 голосов
/ 04 февраля 2011

Я уже добавил это в комментарий, но, подумав об этом, я думаю, что лучший способ сделать это (использовать другую библиотеку только для тестирования / отладки) - это использовать LD_PRELOAD, см. Что такое уловка LD_PRELOAD?

Со страницы руководства:

LD_PRELOAD

Разделенный пробелами список дополнительных пользовательских библиотек ELF, указанных пользователем, которые должны быть загружены раньше всех остальных. Это можно использовать для выборочного переопределения функций в других общих библиотеках. Для двоичных файлов ELF set-user-ID / set-group-ID будут загружены только библиотеки в стандартных каталогах поиска, которые также являются set-user-ID.

Обновление:

После обновленного вопроса кажется, что приложение использует dlopen, чтобы открыть библиотеку, используя абсолютный путь. Я не думаю, что вы можете сделать что-нибудь с этим. См man dlopen

Update2:

Может быть, вы можете кое-что сделать: вы можете LD_PRELOAD создать собственную dlopen функцию, которая изменяет путь к вашей собственной библиотеке ...

2 голосов
/ 04 февраля 2011

Поместите все в одну строку:

LD_LIBRARY_PATH=foo binary_app&
2 голосов
/ 04 февраля 2011

Вы случайно не устанавливаете или не настраиваете приложение? В этом случае LD_LIBRARY_PATH будет игнорироваться.

...