Зміна пов'язаної бібліотеки для даного виконуваного файлу (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 є opensl 1.0.0-fips libs. Я хочу експериментувати з бібліотеками 1.0.1, тому я вбудував їх у свій домашній каталог. Чи є спосіб перейти a.outдо моїх нових бібліотек openssl без особливого болю? Я хотів би уникнути

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

Чи можна тут робити те, на що я сподіваюся?

Відповіді:


22

Ви можете тимчасово замінити іншу бібліотеку для цього конкретного виконання. У Linux змінна середовища LD_LIBRARY_PATH - це розділений двокрапкою набір каталогів, де слід спочатку шукати бібліотеки перед стандартним набором каталогів; це корисно при налагодженні нової бібліотеки або використанні нестандартної бібліотеки для спеціальних цілей. Змінна середовища LD_PRELOAD перераховує спільні бібліотеки з функціями, які перекривають стандартний набір, як і /etc/ld.so.preload. - Спільні бібліотеки

Ви також можете викликати завантажувач безпосередньо:

/lib/ld-linux.so.2 --бібліотека-шлях 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. Саме те, що мені було потрібно.
Рагхав РВ

Мила історія, Microsoft занадто дурний, щоб витратити на це 2 хвилини, і радить всім використовувати LD_LIBRARY_PATH, а не зв'язувати SQL Server з явним відкриттям-1.0.0 або перекомпілювати до версії openssl.so blogs.msdn.microsoft.com/sql_server_team /…
Еван Керролл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.