Как изменить пути к общим библиотекам (.so-файлы) для одного экземпляра терминала

Я хочу удалить некоторые пути, используемые компоновщиком для поиска .so библиотек для целей тестирования.

Я нашел способ добавить пути к библиотеке:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" 

Есть ли переменная, подобная LD_LIBRARY_PATH которую я могу использовать для удаления путей библиотек, таких как /usr/local/lib или /usr/lib , которые не находятся в LD_LIBRARY_PATH но получены линкером? Т.е. как я могу игнорировать пути, указанные в /etc/ld.so.conf.d/?

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

Вам было бы интересно удалить пути библиотеки, если данная разделяемая библиотека имеет встроенные пути через функцию rpath . Они добавляются во время создания библиотеки компоновщиком.

Вы можете удалить (или изменить) эти пути с помощью chrpath , например,

 chrpath -d mylibraryfile.so 

Удаление возможных путей из LD_LIBRARY_PATH также является возможной областью интересов; вы можете сделать это путем замены строки и реэкспортирования переменной. Однако вопрос, похоже, не связан с этим. Нет переменной, которая действует для отмены LD_LIBRARY_PATH .

Для просмотра зависимостей библиотек упоминание /etc/ld.so.conf.d/ заставляет его звучать так, как будто платформа – это только Linux. Вы можете использовать ldd для отображения зависимостей. Помимо OSX, все BSD также поддерживают ldd . Вот один из сценариев, которые я использую для этой цели:

 #!/bin/sh # $Id: ldd-path,v 1.1 2007/07/09 19:30:28 tom Exp $ # Edit the output of ldd for the given parameters, yielding only the # absolute pathnames. ldd $* | sed \ -e 's/([^)]*)//g' \ -e 's/^.*=>//' \ -e 's/[ ][ ]*//g' \ -e '/^$/d' 

Но (обращаясь к комментарию), нет портативного механизма, говорящего загрузчику игнорировать существующий путь. Документация GNU ld дает краткое изложение того, что требуется, и порядок в описании параметра -rpath . Эти пункты завершают список:

  • Каталоги по умолчанию, обычно /lib и /usr/lib .
  • Для родного компоновщика в системе ELF, если файл /etc/ld.so.conf существует, список каталогов, найденных в этом файле.

дальнейшее чтение

  • Могу ли я изменить «rpath» в уже скомпилированном двоичном файле?
  • RPATH, RUNPATH и динамическая компоновка