Как двоичный файл Unix решает, где получить общую библиотеку?

1947
Aftershock

Я использую исполняемый файл Linux, библиотеки расположены во многих местах. Я имею в виду ту же библиотеку с другой версией. Проблема в том, что исполняемый файл забирает исполняемый файл в неправильной библиотеке. Операционная система Ubuntu 64 бит.

Библиотеки находятся в / usr / local / lib и / usr / lib / x86_64-linux-gnu. Я хотел бы, чтобы он использовал / usr / local / lib version.

Чтобы заставить его использовать версию / usr / local / lib. Я скопировал .so оттуда в / usr / lib / x86_64-linux-gnu и удалил .so, на который есть ссылки. В результате программное обеспечение (VLC) не использовало вновь скопированные библиотеки, но оно перестало работать должным образом и не нашло библиотеку вообще. Несмотря на то, что это было там. Так что не ясно, как VLC решает, какую библиотеку использовать.

Понятно, что он использует файлы в /etc/ld.so.conf.d для получения путей к библиотекам. (Файлы содержат / usr / local / lib и / usr / lib / x86_64-linux-gnu) Почему не выбирается библиотека, которую я скопировал в / usr / lib / x86_64-linux-gnu или в / usr / local / lib?

LD_LIBRARY_PATH не установлен.

Обновить:

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

2
LD_LIBRARY_PATH не установлен. <- это твоя проблема Gung Foo 11 лет назад 0
Почему ты это сказал? Aftershock 11 лет назад 0
потому что это где библиотеки ищут. Gung Foo 11 лет назад 0
Разве эти вещи не устанавливаются, когда программа компилируется и связывается? Пожалуйста, предоставьте больше деталей, включая конкретные ошибки и библиотеку, о которой идет речь. Ярослав Рахматуллин 11 лет назад 0
да, я думал, что мог бы просто добавить другую версию, программа использовала бы это, но кажется, что версия библиотеки установлена ​​во время компиляции. поэтому он не будет использовать новую версию, просто потому что я удаляю старую. Aftershock 11 лет назад 0

1 ответ на вопрос

0
drahnr

Two ways this can be achieved

a) Setting rpath at linktime - this is a very ugly and unportable way and should be avoided whereever possible

b) Using the LD_LIBRARY_PATH environment variable (don't forget to export that if you change it!)


If you want to use a specific version/modified/foo-reason for your binary I suggest to

a) link against it statically if the license allows that

b) use LD_PRELOAD like explained here https://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick

c) modify the LD_LIBRARY_PATH (make sure your path is the very first in that list, they are searched in order) by using a run-script which does that

Похожие вопросы