Как загрузить общую библиотеку без загрузки ее зависимостей? - PullRequest
13 голосов
/ 06 января 2010

Скажем, у меня есть библиотека 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 до , а не загрузки символов.


EDIT

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

У нас есть 3 игрока:

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

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

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

Ответы [ 5 ]

4 голосов
/ 06 января 2010

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

0 голосов
/ 06 января 2010

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

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

0 голосов
/ 06 января 2010

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

0 голосов
/ 06 января 2010

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

0 голосов
/ 06 января 2010

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

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

...