Загружать разделяемую библиотеку, только если встречаются зависимости - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть исполняемый файл, который связан с двумя общими библиотеками, каждая из которых имеет зависимости от системных общих библиотек.(В данном случае это библиотеки времени выполнения OpenCL и CUDA, но это не влияет на проблему)

     +--> libA.so  --->  libOpenCL.so (on system)
Exe -|
     +--> libB.so  --->  libcudart.so (on system)

Exe вместе с libA.so и libB.so передаются пользователю.Возможно, пользователь не установил libOpenCL.so и / или libcudart.so в своей системе.

Цель состоит в том, чтобы Exe мог запускаться в любом случае и обнаруживать во время выполнения, что, например, libA.so не можетбыть загружен, потому что его зависимости не встречаются.

Одна из возможностей - сделать так, чтобы libA.so загружался во время выполнения, используя dlopen(), где он обнаруживает, если загрузка не удалась.

Isтакже возможно нормально связать libA.so с Exe, но таким образом, что Exe все еще может запускаться, если libA.so не может быть загружен?Это возможно на платформах Linux и / или Windows?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

В Windows вы можете связать libA и libB с потенциально отсутствующими DLL-библиотеками в режиме загрузки с задержкой .Это предотвратит загрузку DLL во время выполнения системой до тех пор, пока ваша программа на самом деле не вызовет одну из ее функций.

В Linux нет функции отложенной загрузки из коробки, но вы можете имитировать ее, добавив фиктивные оболочки для функций из libOpenCL.so (или libcudart.so) в libA (или libB).Оболочкам dlopen понадобятся библиотеки при первом вызове и переход к реальной реализации функций.Такие оболочки могут быть написаны вручную или сгенерированы автоматически через Implib.so :

# This will generate libOpenCL.tramp.S and libOpenCL.init.c
# which need to be linked into libA.
$ implib-gen.py libOpenCL.so

В результате libA больше не будет напрямую связан с libOpenCL.so, и ваша программа будетработать нормально, если вы не вызываете функции, которые используют OpenCL.

0 голосов
/ 28 сентября 2018

Если вы хотите сделать это, вам нужно dlopen.Во время загрузки программы не существует вектора для сообщения об ошибках, кроме неудачного выполнения, и нет никакого разумного выбора того, к чему решат символы, предназначенные для поиска в отсутствующей библиотеке, если у них нет определения.

...