2012-06-22 6 views
0

Мне нужно выделить точный набор зависимостей разделяемой библиотеки двоичной программы. Я работаю над linux, и проект написан на моем C++. Таким образом, мне нужна рекурсивная ldd-подобная функциональность на C++. Как мне это сделать?Печать общих библиографических зависимостей от C++

+0

Erm ... если вы должны быть конкретными в отношении библиотек, почему бы не использовать статическую сборку? Жесткие кодировки динамических зависимостей неизбежно станут королевской болью, когда (а не если) наступает день, когда вы не успеваете за изменениями в сторонних библиотеках ... – DevSolar

+0

[Рекурсивный-ldd] (http: // sourceforge. net/projects/recursive-ldd /) делает это в Perl ... – DevSolar

+0

Ну ... Я не слишком уверен, что делать, поэтому я буду более конкретным: у меня есть программа с двумя процессами. Основной процесс и детский процесс - это то, что называется основной и запущено в chroot. Чтобы иметь возможность запускать этот дочерний процесс в chroot, его зависимости должны быть помещены в среду chroot. Но рекурсивно binding/lib,/lib64,/usr/lib и т. Д. Является нежелательным решением. Вот почему я хотел бы определить библиотеки в основном процессе и скопировать их в соответствующее место до вызова chrooted дочернего процесса. – mirage

ответ

3

Чтобы процитировать Хана Соло, «у меня плохое представление об этом». Настройка chroot для дочернего процесса из C++-программы звучит как какое-то архитектурное заблуждение/отвращение дальше линии. К сожалению, готового решения на C++ не возникает. Вы могли, конечно, запустить ltrace/Трассирование/рекурсивного LDD и анализировать их выход ...

... но, вообще говоря, идея заключается в том, чтобы настроить среду CHROOT статически (то есть до того, как процессы запускаются), а не динамически. При динамическом подходе злоумышленник может обмануть основной процесс, полагая, что он должен дать ребенку процесс, который он не должен иметь в chroot. Это побеждает всю цель.

Инструменты для статически настройки до CHROOT среды для данного исполняемого файла много, инструменты для этого динамически я не мог найти. Это намек сам по себе.

0

В то же время я нашел следующее: linux/gcc: ldd functionality from inside a C/C++ program , где принято решение предлагает использовать:
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1); FILE *ldd = popen("/lib/libz.so");
Я попробовал его и работал как с Баш и от C++ (OFC в этом случае я думаю о эквивалентная версия). Однако, если я запускал либо версии для двоичного кода SUID (что у меня есть на самом деле), тогда я получил код выхода 5 (я думаю, проблемы с разрешением).

Тогда я проследил, что LDD именно делает и следующий кажется хорошо (по крайней мере, в командной строке):
LD_TRACE_LOADED_OBJECTS=1 /lib64/ld-linux-x86-64.so.2 binary_name
The (фиктивная) вопрос: что является эквивалентом реализации этого в C++?

Смежные вопросы