LINUX.ORG.RU

g++, ld имена динамических библиотек в зависимостях исполняемого файла


0

1

Компилирую программу, которую планирую запускать на разных дистрибутивах. Но после линковки получаю в зависимостях имя динамической библиотеки вместе с версией (например libssl.so.1.0.0), а на разных дистрибутивах

  • Та же самая библиотека может называться по другому (например libssl.so.1.0.0c).
  • Минорные релизы между собой совместимы обычно, и мне всё равно будет это 1.0.0, 1.0.0a или 1.0.2

Символические ссылки на бибилиотеки идут до уровня ".so", а можно ли мне прилинковаться именно к тому уровню который я захочу? Простой "-lssl" находит самое полное имя. И даже если я задам полный путь /usr/lib/libssl.so, хитрый ld раскручивает символические ссылки.

Делайте симлинки при установке.

anon_666
()

[вредный_совет]Загружай либу dlopen'ом.[/вредный_совет]

const86 ★★★★★
()

можно скопировать системную libssl (без симлинка) в директорию, где происходит линковка, затем возпользоваться ключом -L.

Цитата из «man ld»: Directories specified on the command line are searched before the default directories.

ringill
()

SONAME

Упрощенная схема:
1. Когда линкеру указывается библиотека в формате "-lssl" он просто (в случае Линукса) ищет libssl.so
2. Далее он пытается найти внутри нее SONAME (можно посмотреть objdump'ом). Это имя было задано при сборке самой библиотеки через опцию линкера "-soname SONAME". Обычно в SONAME используется только мажорная версия (например, libssl.so.1)
3. Вот этот самый SONAME и добавляется в список библиотек, которые должны быть загружены при запуске твоей программы. Т.е. именно такое имя и будет искаться.

Таким образом:
- Неважно как ты переименуешь файл библиотеки, или какие линки на него сделаешь, главное какой внутри SONAME (он, кстати, может быть вообще левым, например, если задать в твоей libssl.so.1.0.0 SONAME=libusb.so.1 и собрать твою программу с "-lssl", тогда при запуске она будет пытаться найти libusb.so.1).
- Чтобы прилинковаться к тому уровню, к которому хочется, нужно соответствующим образом подготовить саму библиотеку (изменить ее SONAME), а собирать свою программу можно также, как и раньше.

Так что, первым делом, посмотри какой SONAME внутри библиотеки «libssl.so.1.0.0».

drakamakafon
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.