Linux/GCC:функциональность ldd изнутри программы C/C++
-
19-09-2019 - |
Вопрос
Есть ли простой и эффективный способ узнать, что данный динамически связанный ELF
отсутствует необходимый для его запуска .so, все из внутри программы C/C++?
Мне нужна программа с чем-то похожим функционалом, как ldd
, не пытаясь выполнить ELF
чтобы выяснить (удовлетворенные/неудовлетворенные) зависимости в системе.Возможно, спросить утилиту ld-linux.so через какую-нибудь библиотеку?(Я новичок в этой части Linux =)
ПРИМЕЧАНИЕ:читая исходный код
ldd
не очень помогло моим намерениям:Кажется, чтоldd
на самом деле создает другой процесс и выполняет программу.
Если невозможно узнать, что программа имеет неудовлетворенные зависимости, не выполняя ее, есть ли способ хотя бы быстро составить список необходимых для этого .so ELF
все из моей программы?
Заранее спасибо =)
Решение
Согласно ld.so(8), установка переменной среды LD_TRACE_LOADED_OBJECTS
в непустую строку даст ldd
-подобные результаты (вместо обычного выполнения двоичного файла или библиотеки).
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
Другие советы
Попытался ли ты dlopen
функция?вы можете использовать это для загрузки динамической библиотеки (или, в вашем случае, для проверки возможности загрузки библиотеки).
Иметь список необходимых библиотек сложнее, взгляните на handle_dynamic
функция включена источник чтения
А как насчет использования ptrace() для отслеживания всех вызовов open(), чтобы найти все, от чего зависит программа (однако выходные данные включают файлы, а не только библиотеки). Или, может быть, помогает фильтрация вывода по префиксу в имени файла «/lib». .