Как загрузить общую библиотеку, не загружая ее зависимости?

Скажите, что у меня есть библиотека libfoo.so.1, который зависит (согласно ldd) на libbar.so.1. Однако libbar.so.1 не доступно в данный момент. Мое приложение должно вызвать функцию в libfoo.so.1 который не требует libbar.so.1 вообще.

Есть ли способ загрузиться libfoo.so.1, разрешите функциональный символ и затем назовите его без наличия libbar.so.1 удовлетворить зависимость? Это - случай, "Я знаю то, что я делаю, просто позвольте мне уже сделать это". Я попробовал флаг RTLD_LAZY, но он все еще пытается загрузиться libbar.so.1 библиотека прежде не загрузить символы.


Править

Вот точная ситуация.

У нас есть 3 плеера:

  • libbar.so.1, общая библиотека, расположенная в пути не в LD_LIBRARY_PATH или ldconfig, и чьи зависимости все разрешены
  • libfoo.so.1, общая библиотека, расположенная в другом каталоге, чем libbar, но который зависит от libbar. Во времени выполнения, libfoo будет знать, где расположиться libbar.
  • App, двоичное приложение, которое должно загрузиться libfoo в какой-то момент во время времени выполнения.

App не знает, где найти libbar, но знает это libfoo знает. То, что я пытаюсь выполнить, имеет функцию init в libfoo который просто изменился бы Appтекущий рабочий каталог туда, где libbar расположен, чтобы наконец разрешить все зависимости и сделать всех счастливыми.

libfoo должен будет в конечном счете призвать материал libbar, просто не в этой функции init. Я не думаю, создавая тупик, работал бы, так как символы должны будут в конечном счете решить к реальным функциям.

13
задан Fred 6 January 2010 в 15:02
поделиться

5 ответов

[

]Ну, переменные все равно разрешаются даже с помощью []RTLD_LAZY[], так что в общем случае вам нужно, чтобы все библиотеки были скомпонованы. Похоже, что вы должны создать корешок []libbar.so.1[], который не имеет функциональности и может быть найден компоновщиком.[

].
4
ответ дан 2 December 2019 в 02:18
поделиться

Другая мысль: Будет ли извлечение (с помощью ar(1)) необходимой функции (функций) из libfoo.so.1, либо в файл .o, либо в другой файл .so, а затем связывание с этой справкой по извлечению? Я предполагаю, что ссылка на libbar.so.1 находится в функции libfoo, которая не вызывается (даже косвенно) из вашей программы.

.
0
ответ дан 2 December 2019 в 02:18
поделиться
..

Какие здесь требования? Простая привязка библиотеки не так уж и важна, и, как правило, доброкачественна. Вам не хватает библиотеки? Просто создайте одноименную библиотеку корешков. Вы хотите контролировать или предвосхищать использование символов в библиотеке? Поместите их в другую библиотеку (с правильными тегами версий!) и LD_PRELOAD.

Думаю, мета-вопрос заключается в том, что я не вижу, какое значение имеет возможность вытеснить связывание с зависимостями. Это просто вспомогательная функция.

0
ответ дан 2 December 2019 в 02:18
поделиться
[

] Просто мысль, думали ли вы о межпозиционной зависимости - просто создайте идентичную функцию с одинаковой сигнатурой, параметрами и т.д. и позвольте компоновщику разрешить эту функцию и проигнорировать libbar.so.1? Так как вы не упомянули об этом, я решил предложить это.[

] [

]Надеюсь, это поможет, С наилучшими пожеланиями, Том.[

]
0
ответ дан 2 December 2019 в 02:18
поделиться
[

] Используйте dlopen для загрузки библиотеки и dlsym для получения нужной вам функции. [

]
-1
ответ дан 2 December 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: