LINUX.ORG.RU

Динамическая загрузка библиотеки из системы

 


0

2

ПРимер кода:

handle = C.dlopen("systemlibrary.so.1", RTLD_LAZY)

Вопрос как узнать имя библиотеки в системе ? Почему нет .so, а есть so.1 в некоторых линуксах ?

Т е например мне нужно это сделать, если я знаю только что -lmylibrary есть в системе



Последнее исправление: Jopich1 (всего исправлений: 2)

dlopen

Зачем использовать этот механизм линковки? Он слишком своеобразный, по меркам Линукс «с причудами».

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

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

Jopich1
() автор топика
Последнее исправление: Jopich1 (всего исправлений: 1)
Ответ на: комментарий от Jopich1

начальство сказало: «хочу бинарник, который сам определяет есть ли библиотека в системе и подключает его»

А если нет библиотеки в системе?

anonymous
()
Ответ на: комментарий от Jopich1

А тащить с собой эту библиотеку или статиком прилинковать не вариант?

Потому что с dlopen огрести проще, чем кажется.

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

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

Следующее – гарантий на совместимость между зоопарком линуксов нет. На моей памяти было такое, что SDL2 который мы пакуем в AppImage пытался подгрузить динамически библиотеки PulseAudio и ALSA. Где-то обе попытки проваливались, итог – нет звука. Где конкретно что-то сломалось никто не знает.

В-третьих – баги линкера. В некоторых версиях glibc линкер отказывался выгружать из памяти библиотеку если находил в ней GNU_UNIQUE символы. dlclose() не репортит ошибку, со стороны программы узнать напоролись ли мы на баг невозможно. Бывало ещё такое, что в программе A название функции совпадало с именем в библиотеке B и если бы линкер сказал про multiple definition, то в случае dlopen он молча подменил адреса функции в B адресом функции из A.

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

DuckDuckGo. Вторая по счёту ссылка ведёт куда надо, но всё же.

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

dlfcn это POSIX. Это и стандарт, по нему dlfcn не идёт дальше dlopen/dlsym/dlclose. Но и не глючных линкеров тоже нет.

Некоторые вещи мне кажется ещё зависят от «так сложилось». То же поведение с заменой символа – это скорее всего следствие того, как работает тот же LD_PRELOAD.

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

Кривые руки – это пофикшенные баги в апстриме?

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

Некоторые вещи мне кажется ещё зависят от «так сложилось». То же поведение с заменой символа – это скорее всего следствие того, как работает тот же LD_PRELOAD.

«Подмена символа» - это охерительная фича, просто уметь надо. Для того чтобы назвать это «багом», навскидку нужно не разобраться в: неймспейсах для плагинов, RTLD_LOCAL/RTLD_GLOBAL, RTLD_DEEPBIND.

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

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

Я думаю, что в ряде случаев позиция этого начальства выглядит вполне разумной. Например, есть графический редактор, который может поддерживать сканирование, если в системе установлен sane. Тащить этот самый sane в виде жёсткой зависимости неразумно. Сделать как в гимпе — отдельный плагин, который уже и работает с самим sane — решение рабочее, но довольно-таки много оверинжиниринга на мой взгляд (не говоря уж о том, что то, как это сделано именно в гимп-плагине, сделано очень коряво для пользователя). В этом случае можно было бы проверять наличие libsane и грузить её только по доступности.

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

Другое дело, что в большинстве случаев лучше вызывать не сам dlopen, а какую-нибудь кроссплатформенную обёртку над ним (такие обёртки, например, есть в Qt и SDL).

hobbit ★★★★★
()

Вопрос как узнать имя библиотеки в системе ?

зачем ты ставишь пробел перед вопросительным знаком

А по теме — пошариться во всех директориях, перечисленных в /etc/ld.so.conf и в файликах внутри /etc/ld.so.conf.d/ и попытаться найти mylibrary.so там

Почему нет .so, а есть so.1 в некоторых линуксах ?

обычно mylibrary.so есть в виде симлинка, который указывает на mylibrary.so.1, который в свою очередь симлинк на сам файл либы конкретной версии mylibrary.so.1.2.3.4

Harald ★★★★★
()

если я знаю только что -lmylibrary есть в системе

в этом случае stat(2) и readlink(2) спасут отца русской демократии. прыгай себе по симлинкам, пока до реального бинаря не доберешься

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

перечисленных в /etc/ld.so.conf и в файликах внутри /etc/ld.so.conf.d/

и про $LD_LIBRARY_PATH не забыть

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

А тащить с собой эту библиотеку или статиком прилинковать не вариант?

очень часто не вариант по лицензионным соображениям

Потому что с dlopen огрести проще, чем кажется.

но сложнее, чем вы об этом написали

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