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

Скажем, у меня есть библиотека 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. Я не думаю, что создание заглушки будет работать, так как в конечном итоге символы должны будут разрешаться для реальных функций.

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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