Как двоичный файл 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, который делает это

Другие вопросы по тегам