linux / gcc: функциональность ldd внутри программы C / C ++ - PullRequest
6 голосов
/ 05 октября 2009

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

Мне нужна программа с функциями, аналогичными ldd, без попытки выполнить ELF, чтобы выяснить (встретил / не удовлетворил) зависимости в системе. Возможно, спросите утилиту ld-linux.so через какую-то библиотеку? (Я новичок в этой части Linux =)

ПРИМЕЧАНИЕ: чтение исходного кода ldd не очень помогло моим намерениям: кажется, что ldd фактически разветвляет другой процесс и выполняет программу.

Если невозможно узнать, что программа имеет неудовлетворенные зависимости, не выполняя ее, есть ли способ, по крайней мере, быстро перечислить .so, необходимые для этого ELF все из моей программы?

Заранее спасибо =)

Ответы [ 3 ]

8 голосов
/ 05 октября 2009

Согласно ld.so (8) , установка переменной окружения LD_TRACE_LOADED_OBJECTS в непустую строку даст ldd -подобные результаты (вместо обычного выполнения двоичного файла или библиотеки).

setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
1 голос
/ 05 октября 2009

Вы пробовали dlopen функцию? Вы можете использовать это для загрузки динамической библиотеки (или, в вашем случае, для проверки возможности загрузки библиотеки).

Получить список необходимых библиотек сложнее, посмотрите на handle_dynamic функцию readelf source

0 голосов
/ 16 апреля 2018

Как насчет использования ptrace () для отслеживания всех вызовов open (), чтобы найти все, от чего зависит программа (однако вывод включает в себя файлы, а не только библиотеки). Или, возможно, отфильтруйте вывод по префиксу в имени файла "/ lib "помогает.

...