Как двоичный файл Unix решает, где получить общую библиотеку?
Я использую исполняемый файл 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 не установлен.
Обновить:
Я думал, что мог бы просто добавить другую версию, программа использовала бы это, но кажется, что версия библиотеки установлена во время компиляции для данного исполняемого файла. поэтому он не будет использовать новую версию, просто потому что я удаляю старую.
1 ответ
Это может быть достигнуто двумя способами
а) Настройка rpath
во время соединения - это очень уродливый и непереносимый способ, и его следует избегать везде, где это возможно
б) Использование LD_LIBRARY_PATH
переменная окружения (не забудьте экспортировать ее, если измените!)
Если вы хотите использовать конкретную версию / модифицированную / Foo-причину для вашего двоичного файла, я предлагаю
а) ссылаться на него статически, если лицензия позволяет
б) использовать LD_PRELOAD
как объяснено здесь https://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick
в) изменить LD_LIBRARY_PATH
(убедитесь, что ваш путь самый первый в этом списке, они ищутся по порядку) с помощью run-script, который делает это