Почему / где код запрашивает определенную версию библиотеки? - PullRequest
0 голосов
/ 15 февраля 2019

Это в Linux.У меня есть исходный код небольшого инструмента, который я устанавливаю на некоторых новых хостах.Я компилирую код на новых хостах, но он жалуется на отсутствующую библиотеку:

ldd code.so
libpcre.so.0 => not found

На новых хостах установлен libpcre.so.1.Итак, вот мой вопрос: почему он не компилируется с библиотекой .so.1?Почему он ищет именно .so.0?Я искал в исходном коде и в нескольких заголовочных файлах, что он include s, но нет ссылки на конкретную версию библиотеки.

В следующем документе упоминается «Программы, когда они внутренне перечисляют необходимые им совместно используемые библиотеки».Кажется, что это движется в правильном направлении, но это не уточняет, как или где программа будет делать это.

1 Ответ

0 голосов
/ 15 февраля 2019

Хорошо, если посмотреть дальше, то получается, что когда программа компилируется и связывается, компоновщик автоматически вставляет сонам всех необходимых библиотек в сам скомпилированный двоичный файл:

objdump -p ip.so | grep NEEDED
NEEDED               libpcre.so.0
strings ip.so | grep pcre
libpcre.so.0

В моем случаеВ этом случае программе, о которой я говорил, требуется вышеуказанный общий объект, для которого требуется библиотека pcre с soname libpcre.so.0.Так вот где зависимость терпит неудачу.Несмотря на то, что мой новый хост имеет библиотеку libpcre, у него другое имя (libpcre.so.1 вместо libpcre.so.0) и, следовательно, сбой.

Что было бы интересно: кто-нибудь знает, есть ли способ указать компоновщику заменить другое имя вместо того, которое указано в списке зависимостей?Очевидно, что это не будет работать большую часть времени (если имя сонама меняется, скорее всего, потому что новая версия больше не обратно совместима), но все же стоит знать, как это сделать, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...