Есть ли способ проверить или получить доступ к именам библиотек, с которыми двоичный файл 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, с которым в данный момент динамически связан модуль.
Есть какой-либо способ сделать это?
Я хочу позвонить
void *handle = dlopen("...", ...)
Предположительно, вы хотите позвонить dlsym(handle, "SomePythonSymbol")
,
Это бессмысленный вещь которую нужно сделать. Вместо выполнения динамического поиска, просто вызовите SomePythonSymbol
непосредственно.
Чтобы ответить на ваш оригинальный вопрос «с какой версией libpython я связан», в системе на основе GLIBC вы можете использовать dl_iterate_phdr перечислить все загруженные в данный момент разделяемые библиотеки.
Если у вас уже есть символ, который, как вы знаете, определен в libpython, dladdr1 сделает поиск библиотеки еще проще.
В Linux вы можете прочитать /proc/self/maps
или же /proc/self/map_files
, но это не переносимо на другие платформы.