Как приложения разрешают разные версии общих библиотек во время выполнения? - PullRequest
35 голосов
/ 01 октября 2010

Я новичок в том, как разделяемые библиотеки работают на Linux.Я пытаюсь понять, как приложения разрешают разные ревизии одной и той же разделяемой библиотеки во время выполнения в linux.

Насколько я понимаю, разделяемая библиотека имеет три "имени", например,

  1. libmy.so.1.2 (реальное имя, то есть фактический файл obj)
  2. libmy.so.1 (SONAME, который встроен в фактический файл obj)
  3. libmy.so (имя компоновщика, предоставленное компоновщику во время компоновки и встроенное в исполняемый файл)

При установке библиотеки через LDCONFIG она создаст следующие символические ссылки

  • (2) => (1)
  • (3) => (2)

Теперь предположим, что я собираю другую версию той же библиотеки со следующим реальным именем, libmy.so.2.0.SONAME в соответствии с рекомендациями будет libmy.so.2.0

Во время ссылки приложения, какое имя компоновщика я предоставлю с флагом "-l".Следуя инструкциям, которые я прочитал (http://www.dwheeler.com/program-library/Program-Library-HOWTO/x36.html),, не обязательно ли это будет libmy.so, и если да, то как будут различаться обе версии файла obj?

Ответы [ 3 ]

42 голосов
/ 01 октября 2010

Управление версиями общих объектов работает следующим образом:

Когда вы создаете общий объект, вы даете ему реальное имя и soname. Они используются для установки общего объекта (который создает как объект, так и ссылку на него).

Таким образом, вы можете в конечном итоге с ситуацией:

pax> ls -al xyz*
-rw-r--r--  1 pax paxgroup    12345 Nov 18  2009 xyz.so.1.5
lrwxrwxrwx  1 pax paxgroup        0 Nov 18  2009 xyz.so.1 -> xyz.so.1.5
lrwxrwxrwx  1 pax paxgroup        0 Nov 18  2009 xyz.so -> xyz.so.1

с xyz.so.1.5, обладающим SONAME из xyz.so.1.

Когда компоновщик связывается в xyz.so, он следует по ссылкам вплоть до xyz.so.1.5 и использует его SONAME из xyz.so.1 для хранения в исполняемом файле. Затем, когда вы запускаете исполняемый файл, он пытается загрузить xyz.so.1, что будет указывать на определенный xyz.so.1.N (не обязательно версия 1.5).

Таким образом, вы можете установить xyz.so.1.6 и обновить ссылку xyz.so.1, чтобы она указала на нее, а уже связанные с ней исполняемые файлы использовали бы ее вместо этого.

Одним из преимуществ этого многоуровневого метода является то, что вы можете иметь несколько потенциально несовместимых библиотек с одинаковыми именами (xyz.so.1.*, xyz.so.2.*), но в каждой основной версии вы можете свободно обновлять их , так как они должны быть совместимы .

Когда вы связываете новые исполняемые файлы:

  • Те, кто связывается с xyz.so, получат последнюю минорную версию последней основной версии.
  • Другие пользователи, ссылающиеся на xyz.so.1, получат последнюю минорную версию определенной основной версии.
  • Третьи, ссылающиеся на xyz.so.1.2, получат определенную младшую версию определенной основной версии.

Теперь запомните последний абзац, когда мы изучим ваш комментарий:

Теперь допустим, я скомпилировал еще одну версию той же библиотеки со следующим реальным именем, libmy.so.2.0. SONAME по правилам будет libmy.so.2.0.

Нет, я не верю в это. Скорее всего, soname будет libmy.so.2, чтобы вы могли вносить незначительные обновления в поток 2.x и получать последние сведения.

2 голосов
/ 01 октября 2010

Во время ссылки приложения, если вы укажете -lmy, компоновщик будет искать файл с именем libmy.so. Он найдет этот файл и свяжет с ним исполняемый файл. Если этот файл является символической ссылкой, то ваше приложение будет связано с целью символической ссылки.

Время ссылки на приложение , где можно указать, какую версию динамической библиотеки вы хотите использовать с вашим приложением.

0 голосов
/ 22 августа 2018
  1. В библиотеках есть разные версии в имени.
  2. Пакеты с именем "lib" имеют только библиотеки и имеют разные версии в имени.
  3. Система будет компилироваться только с последней версиейбиблиотека, если вы не определите другую.
  4. Приложение использует только те библиотеки, которые ему нужны.Проверьте ldd, readelf.
  5. Приложения содержат ссылку .so и .pc файл, для чего проверьте систему rpm.https://fedoraproject.org/wiki/Packaging:Guidelines?rd=Packaging#Devel_Packages
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...