LINUX.ORG.RU

Как при сборке определяется версия линкуемой разделяемой библиотеки?

 ,


0

1

Собираю под линукс вот такую штуку http://www.vlfeat.org/matconvnet/install/ После сборки, ldd для полученных бинарников говорит, что нужна libjpeg.so.9. В операционной системе(gentoo) есть только libjpeg.so.62. Ни в документации по проекту, ни в коде я не нашел явного требования именно 9-ой версии. Отсюда вопрос, кто и как определил, что нужна именно такая версия библиотеки?

★★★

Когда собирается приложение (или .so), линкующееся с libjpeg, в ELF-заголовки записывается soname слинкованной библиотеки, например, «NEEDED libjpeg.so.9». Посмотреть можно, например, objdump -p

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Это я понимаю. Но бинарник собирается у меня на машине. Вопрос в том, почему именно эта версия была прописана в бинарнике?

LIKAN ★★★ ()
Ответ на: комментарий от annulen

Ну я и создал тему, чтоб узнать как это изучить! В системе файлов с таким названием нет, в скриптах для сборки - тоже.

LIKAN ★★★ ()

При сборке компоновщик ищет libjpeg.so. Обычно это симлинк, который указывает на что-то типа libjpeg.so.62.2.0, возможно, через другие симлинки. В итоговый бинарник компоновщик прописывает зависимость не от libjpeg.so, а от значения поля SONAME в библиотеке. У libjpeg.so.60.2.0 там прописано «libjpeg.so.62», например.

$ objdump -p libjpeg.so | grep SONAME
  SONAME               libjpeg.so.62

Если ты делаешь библиотеку, выбирай SONAME, который в неё запишешь, правильно. Тебе нужно гарантировать, что все библиотеки с таким же SONAME будут бинарно-совместимы.

Если у тебя получилась зависимость от libjpeg.so.9, значит где-то была библиотека с SONAME libjpeg.so.9. Проверь, может при сборке твоего софта собирается ещё одна копия libjpeg.

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от LIKAN

1. Внимательно посмотреть на команду линковки - может быть, сразу станет ясно, откуда прицепилась не та" библиотека

2. Перезапустить линковку (т.е. команду из п1) с -Wl,--trace - увидишь полный путь откуда линкер берет libjpeg.so.9

annulen ★★★★★ ()

В операционной системе(gentoo) есть только libjpeg.so.62

Есть два варианта:

  • в проекте есть so-шка, которая слинкована с libjpeg.so.9 и эта сошка прилинковывается к твоему бинарю
  • ты давно не делал revdep-rebuild и у тебя завалялось говно мамонта, слинкованное с libjpeg.so.9, и вот с этим говном твой бинарник полинкован
kawaii_neko ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.