Скажите, что у меня есть библиотека 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. Я не думаю, создавая тупик, работал бы, так как символы должны будут в конечном счете решить к реальным функциям.
]Ну, переменные все равно разрешаются даже с помощью []RTLD_LAZY[
], так что в общем случае вам нужно, чтобы все библиотеки были скомпонованы. Похоже, что вы должны создать корешок []libbar.so.1[
], который не имеет функциональности и может быть найден компоновщиком.[
Другая мысль: Будет ли извлечение (с помощью ar(1)) необходимой функции (функций) из libfoo.so.1
, либо в файл .o
, либо в другой файл .so
, а затем связывание с этой справкой по извлечению? Я предполагаю, что ссылка на libbar.so.1
находится в функции libfoo, которая не вызывается (даже косвенно) из вашей программы.
Какие здесь требования? Простая привязка библиотеки не так уж и важна, и, как правило, доброкачественна. Вам не хватает библиотеки? Просто создайте одноименную библиотеку корешков. Вы хотите контролировать или предвосхищать использование символов в библиотеке? Поместите их в другую библиотеку (с правильными тегами версий!) и LD_PRELOAD.
Думаю, мета-вопрос заключается в том, что я не вижу, какое значение имеет возможность вытеснить связывание с зависимостями. Это просто вспомогательная функция.
] Просто мысль, думали ли вы о межпозиционной зависимости - просто создайте идентичную функцию с одинаковой сигнатурой, параметрами и т.д. и позвольте компоновщику разрешить эту функцию и проигнорировать libbar.so.1? Так как вы не упомянули об этом, я решил предложить это.[
] []Надеюсь, это поможет, С наилучшими пожеланиями, Том.[
]] Используйте dlopen для загрузки библиотеки и dlsym для получения нужной вам функции. [
]