Проверка общих зависимостей C ++ во время выполнения (ldd on self)

Есть ли способ проверить или получить доступ к именам библиотек, с которыми двоичный файл C ++ динамически связан внутри самого двоичного файла?

По сути хочу бегать ldd на двоичном, без запуска ldd,

Вариант использования использует dlopen от dlfcn.h, У меня есть библиотека C ++, которая связана с libpython, но я не знаю, если это libpython3.5m.so, libpython3.4m.so, libpython2.7.so, так далее…

Я хочу позвонить

void* handle = dlopen( "@PYTHON_LIBRARY@", RTLD_LAZY | RTLD_GLOBAL );

где "@PYTHON_LIBRARY@" разрешает путь к любому текущему libpython, с которым в данный момент динамически связан модуль.

Есть какой-либо способ сделать это?

2

Решение

Я хочу позвонить void *handle = dlopen("...", ...)

Предположительно, вы хотите позвонить dlsym(handle, "SomePythonSymbol"),

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

Чтобы ответить на ваш оригинальный вопрос «с какой версией libpython я связан», в системе на основе GLIBC вы можете использовать dl_iterate_phdr перечислить все загруженные в данный момент разделяемые библиотеки.

Если у вас уже есть символ, который, как вы знаете, определен в libpython, dladdr1 сделает поиск библиотеки еще проще.

2

Другие решения

В Linux вы можете прочитать /proc/self/maps или же /proc/self/map_files, но это не переносимо на другие платформы.

0

По вопросам рекламы [email protected]