Как получить список исполняемых разделяемых библиотек из C ++? - PullRequest
5 голосов
/ 25 октября 2011

Я бы хотел программно получить список общих библиотек, связанных моим двоичным файлом в Linux и Solaris.Сейчас я выкладываю в pmap (я не могу использовать ldd в двоичном файле, потому что он не включает библиотеки dlopen'd, и я не могу использовать pldd, потому что это только Solaris):

std::ostringstream cmd;
cmd << "/usr/bin/pmap " << getpid() << " | awk '{ print $NF }' | grep '\\.so' | sort -u";
FILE* p = popen(cmd.str().c_str(), "r");

Это немного странно, но работает как в Solaris, так и в Linux (вывод pmap немного отличается, но нужная информация всегда находится в последнем столбце).Есть ли способ получить ту же информацию без обстрела?Это работает на обеих платформах?Я предполагаю, что файлы /proc/$PID по-разному форматируются между ними, но я не знаю, где обычно располагаются заголовки, помогающие разобрать их (если вообще есть общее расположение?).

1 Ответ

2 голосов
/ 27 октября 2011

Вы можете использовать команду pmap 1234, где 1234 является идентификатором процесса.

Внутри вашей программы более простой (специфичный для Linux) способ - читать и анализировать файл /proc/self/maps.

Попробуйте запустить

cat /proc/self/maps

под Linux: он покажет вам отображение памяти процесса, выполняющего команду cat, указанную выше.

И если у вас есть какой-то точный указатель, вы можете использовать dladdr (специфическая функция GNU / Linux или Glibc), чтобы получить информацию о том, какая динамическая библиотека содержит его.

...