Можно ли получить расположение зависимых библиотек из кода - PullRequest
0 голосов
/ 03 января 2019

Я хочу загрузить некоторые зависимые библиотеки из моей программы с помощью функции dlopen. Можно ли узнать фактическое местонахождение этих библиотек?

Например, ldd показывает все зависимые библиотеки с путями в системе. Как это работает? Можно ли получить пути к соответствующим библиотекам, которые мне нужно загрузить с помощью dlopen, с помощью некоторого вызова из моего кода C ++?

1 Ответ

0 голосов
/ 03 января 2019

С man dlopen можно прочитать:

Функция dlopen () загружает файл динамической библиотеки, названный именем строки с нулевым символом в конце, и возвращает непрозрачный «дескриптор» для динамической библиотеки. Если имя файла NULL, то возвращаемый дескриптор для основной программы. Если имя файла содержит косую черту ("/"), то оно интерпретируется как (относительный или абсолютный) путь. В противном случае динамический компоновщик ищет библиотеку следующим образом (подробности см. В ld.so (8)):

  • (только ELF) Если исполняемый файл для вызывающей программы содержит тег DT_RPATH и не содержит тег DT_RUNPATH, то производится поиск в каталогах, перечисленных в теге DT_RPATH.

  • Если во время запуска программы переменная среды LD_LIBRARY_PATH была определена как содержащая список каталогов, разделенных двоеточиями, выполняется поиск по ним. (В качестве меры безопасности эта переменная игнорируется для программ set-user-ID и set-group-ID.)

  • (только ELF) Если исполняемый файл для вызывающей программы содержит тег DT_RUNPATH, то в каталогах, перечисленных в этом теге, производится поиск.

  • Файл кэша /etc/ld.so.cache (поддерживается ldconfig (8)) проверяется, чтобы увидеть, содержит ли он запись для имени файла.

  • Поиск в каталогах /lib и /usr/lib (в таком порядке).

Итак, если нужная библиотека «установлена», подойдет простой dlopen("foobar.so", flag).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...