У меня есть двоичный исполняемый файл с именем "альфа", который требует связанной библиотеки (libz.so.1.2.7), который находится на /home/username/myproduct/lib/libz.so.1.2.7
Я экспортирую то же самое в свой экземпляр терминала, прежде чем порождать мой двоичный исполняемый файл, выполнив следующую команду.
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
Теперь, когда я порождаю другое приложение "bravo", которое требует ту же библиотеку, но другой версии, т.е. (libz.so.1.2.8), которая доступна в
/lib/x86_64-linux-gnu/libz.so.1.2.8
, система выдает следующую ошибку.
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
Если я сбросил LD_LIBRARY_PATH
, "Браво" запускается нормально. Я понимаю, что вышеупомянутое поведение связано с тем, что LD_LIBRARY_PATH
имеет приоритет над путями каталогов, определенными /etc/ld.so.conf
при поиске связанных библиотек, и, следовательно, произошла вышеуказанная ошибка Мне просто любопытно, почему разработчики UNIX / LINUX не разработали ОС для поиска связанных библиотек в других каталогах в соответствии с иерархией, если первый экземпляр библиотеки имеет другую версию.
Проще говоря, системы UNIX / LINUX проходят через набор каталогов, пока не найдут нужную библиотеку. Но почему он не делает то же самое, пока не найдет ожидаемую версию, а не примет первый экземпляр библиотеки независимо от ее версии?
источник
libz.so.1
является символическойlibz.so.1.2.8
Ответы:
Это так, насколько это известно.
zlib.so.1.2.7
иzlib.so.1.2.8
оба имеют сонамуzlib.so.1
, так что вашиalpha
иbravo
двоичные файлы говорят, что им нужноzlib.so.1
. Динамический загрузчик загружает первую соответствующую ему библиотеку; он не знает, что версия 1.2.8 предоставляет дополнительные символы, которыеbravo
нужны. (Вот почему дистрибутивы стараются указать дополнительную информацию о зависимостях, например,zlib1g (>= 1.2.8)
дляbravo
.)Вы можете подумать, что это легко исправить, но это не так, не в последнюю очередь потому, что двоичные файлы и библиотеки перечисляют необходимые символы отдельно от библиотек, в которых они нуждаются, поэтому загрузчик не может проверить, что данная библиотека предоставляет все символы, которые нужны от этого. Символы могут быть предоставлены различными способами, и введение связи между символами и библиотеками, предоставляющими их, может сломать существующие двоичные файлы. Также добавлена забавная вставка символов, которая усложняет ситуацию (и заставляет разработчиков, чувствительных к безопасности, рвать на себе волосы).
Некоторые библиотеки предоставляют информацию о версии, которая в конечном итоге сохраняется
.gnu.version_r
, со ссылкой на библиотеку, которая может помочь, ноlibz
не является одной из них.(Учитывая сонмы, я ожидаю, что ваш
alpha
бинарный файл будет работать нормальноzlib.so.1.2.8
.)источник
zlib
не использует вlibtool
любом случае, кроме как на Дарвине, где этоar
;-).