2011-10-25 10 views
5

Me gustaría obtener programáticamente una lista de las bibliotecas compartidas vinculadas por mi binario en Linux y Solaris. En este momento un shell de pmap (no puedo usar ldd en el binario, ya que no incluirá bibliotecas dlopen'd, y no puedo usar pldd porque sólo Solaris):¿Cómo obtener la lista de bibliotecas compartidas ejecutables desde C++?

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

Esto es un poco hackish pero funciona tanto en Solaris como en Linux (la salida de pmap es ligeramente diferente pero la información deseada siempre está en la última columna). ¿Hay alguna manera de obtener la misma información sin desembolsar? Eso funciona en ambas plataformas? Supongo que los archivos /proc/$PID están formateados de forma diferente entre ellos, pero no sé dónde se ubican generalmente los encabezados para ayudar a analizar aquellos (si hay una ubicación común en absoluto).

+0

Estrictamente hablando, las bibliotecas 'dlopen'ed no están" vinculadas ", sino que se cargan en tiempo de ejecución. Supongo que realmente quiere una lista de todas las bibliotecas compartidas cargadas. –

+0

Eso es correcto. –

Respuesta

2

Puede usar el comando pmap 1234 con 1234 como identificador de proceso.

Desde dentro de su programa, la manera más simple (específica de Linux) es leer y analizar el archivo /proc/self/maps.

intente ejecutar

cat /proc/self/maps

bajo Linux: se le mostrará la asignación de memoria del proceso que se ejecuta el comando cat anteriormente.

Y si tiene algún puntero preciso, puede usar dladdr (una función específica de GNU/Linux o Glibc) para obtener información sobre qué biblioteca dinámica lo contiene.

Cuestiones relacionadas