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