Изменение связанной библиотеки для данного исполняемого файла (CentOs 6)

29

У меня есть исполняемый файл, связанный следующим образом:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Где библиотеки libcrypto и libssl являются библиотеками openssl 1.0.0-fips. Я хочу поэкспериментировать с библиотеками 1.0.1, поэтому я собрал их в своем домашнем каталоге. Есть ли способ получить a.outссылку на мои новые библиотеки openssl без особых усилий? Я хотел бы избежать

  • Необходимость перекомпоновки a.out(потому что инструменты сборки очень сложны)
  • Изменение любых глобальных настроек (потому что другие разработчики работают на этой машине)

Можно ли сделать то, что я надеюсь здесь?

Fixee
источник

Ответы:

22

Вы можете временно заменить другую библиотеку для этого конкретного выполнения. В Linux переменная среды LD_LIBRARY_PATH - это набор каталогов, разделенный двоеточиями, в котором библиотеки следует искать в первую очередь, перед стандартным набором каталогов; это полезно при отладке новой библиотеки или использовании нестандартной библиотеки для специальных целей. Переменная среды LD_PRELOAD перечисляет общие библиотеки с функциями, которые переопределяют стандартный набор, как это делает /etc/ld.so.preload. - Общие библиотеки

Вы также можете вызвать загрузчик напрямую:

/lib/ld-linux.so.2 --library-path path executable

Дэвид Шварц
источник
1
LD_LIBRARY_PATH не переопределяет путь поиска по умолчанию. Я установил его, но ldd по-прежнему показывает мне системный путь по умолчанию, а не переопределенный. Хотя я могу принудительно загрузить свою собственную библиотеку, установив LD_PRELOAD.
Кальмарий
18

Напишите скрипт-обертку, который устанавливает LD_LIBRARY_PATHпеременную среды. Это подвеска PATHдля общих библиотек. Системный путь поиска всегда ищется после каталогов, перечисленных в $LD_LIBRARY_PATH. См. Руководство по динамическому компоновщику для справки.

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

Или, для разового, прямо в командной строке:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

В качестве альтернативы, если вы хотите изменить двоичный файл, попробуйте chrpath , который позволяет редактировать путь поиска библиотеки, запеченный в исполняемом файле.

Жиль "ТАК - перестань быть злым"
источник
2
+1 за chrpath. Именно то, что мне было нужно.
Raghav RV
Милая история, Microsoft слишком глупа, чтобы тратить 2 минуты на поиски в Google, и рекомендует всем использовать LD_LIBRARY_PATH вместо того, чтобы явно связывать SQL Server с openss-1.0.0 или перекомпилировать с версией openssl.so blogs.msdn.microsoft.com/sql_server_team /…
Эван Кэрролл