При связывании с неопределенной версией библиотеки правильный выбор?

С strace я вижу, что программе нужна некоторая неопределенная версия библиотеки gmp :

 open("/lib/x86_64-linux-gnu/libgmp.so", O_RDONLY|O_CLOEXEC) = \ -1 ENOENT (No such file or directory) 

Я думаю, что он должен быть связан с конкретной версией интерфейса (например, libgmp.so.10 например).

Однако это не похоже на обычную практику. Это случайно или есть веская причина полагаться на неуказанную версию?

Единственным приемлемым случаем, о котором я могу думать, является дистрибутив ОС: вы строите (и контролируете) каждый пакет.

One Solution collect form web for “При связывании с неопределенной версией библиотеки правильный выбор?”

Я бы не сказал «неприемлемый», но для двоичного файла определенно необычно искать общую библиотеку под простым *.so именем во время выполнения. Как правило:

  • Компилятор (время сборки) ищет библиотеки под именами, соответствующими *.so
  • Если найден, линкер обращается к полю SONAME библиотеки, чтобы узнать имя, которое должна быть расположена в библиотеке во время выполнения
  • Он записывает это имя внутри встроенного двоичного файла, чтобы он выполнялся во время выполнения.

Цель этого соглашения заключается в том, что двоичный файл может быть привязан к конкретной версии API-библиотеки.

Возможно, библиотека, о которой идет речь, не использует это соглашение. Чтобы проверить, содержит ли библиотека поле SONAME:

 objdump -p /lib/`arch`-linux-gnu/libthing.so | fgrep SONAME 

Если SONAME не существует, тогда двоичные файлы, связанные с этой библиотекой, по умолчанию будут использовать имя, под которым библиотека была найдена во время сборки (которая равна *.so ). Это может быть то, что вы видите. Если существует SONAME, тогда двоичные файлы, связанные с этой библиотекой, должны были использовать это имя во время выполнения.

  • Программа связана с двумя версиями одной и той же библиотеки?
  • Как использовать 32-битный скомпилированный файл общих объектов (.so) на 64-битном RHEL?
  • Почему ldd не показывает пути имен файлов для зависимостей?
  • Нормально ли для `ldd -version` выйти 1?
  • Не удается найти файл общих объектов, даже если он находится в пути к библиотеке
  • Могу ли я использовать свой собственный ld.so.cache?
  • Ошибка undefined ошибки Mkfs: ext2fs_numeric_progress_ops
  • LD_PRELOAD эквивалент для запуска процесса?
  • Почему ldd показывает это динамическое расположение компоновщика?
  • libcurl.so.4 неопределенная опорная ошибка
  • patch: «дескриптор« плохих файлов »в сочетании с каналом и LD_PRELOAD / libtrash
  • Как обновить общую библиотеку без сбоев?
  • Linux и Unix - лучшая ОС в мире.