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

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

Напишите переносимый сценарий sh, который перечисляет ПУТЬ . Это касается установки без пакета, а также установки пакета, если установка без пакета находится в объявленном месте. (Если вы не можете доверять администраторам, которые сделали установки, которые вы хотите обнаруживать, вам лучше установить свои собственные.)

#!/bin/sh
set -f; IFS=:
set -- $PATH
set +f; unset IFS
for dir; do
  if [ -x "$dir/python" ]; then printf %s "$dir/python is "; "$dir/python -V; fi
  ls -l "$dir/python"* 2>/dev/null
  if [ -x "$dir/python" ]; then printf %s "$dir/g++ is "; "$dir/g++ --version | head -n 1; fi
  ls -l "$dir/g++"* 2>/dev/null
done

Вывод этого сценария является всего лишь примером, вы можете упростить его анализ .

5
26.03.2016, 13:43
1 ответ

Вас может заинтересовать удаление путей к библиотекам, если данная общая библиотека имеет встроенные пути через функцию 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 существует, список каталогов, найденных в этом файле.

Дополнительная литература

6
27.01.2020, 20:39

Теги

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