¿Cómo verificar qué bibliotecas compartidas se cargan en el tiempo de ejecución para un proceso determinado?

¿Hay alguna manera de verificar qué bibliotecas está usando un proceso en ejecución?

Para ser más específico, si un progtwig carga algunas bibliotecas compartidas usando dlopen , entonces readelf o ldd no lo van a mostrar. ¿Es posible obtener esa información de un proceso en ejecución? Si es así, ¿cómo?

Otras personas están en el camino correcto. Aquí hay un par de maneras.

cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq 

O bien, con strace:

 strace CMD.... 2>&1 | grep '^open(".*\.so"' 

Ambos asumen que las bibliotecas compartidas tienen “.so” en algún lugar de su camino, pero puede modificar eso. El primero da resultados bastante bonitos como solo una lista de bibliotecas, una por línea. El segundo continuará enumerando las bibliotecas a medida que se abren, así que eso es bueno.

Editar: Y por supuesto lsof

 lsof -p NNNN | awk '{print $9}' | grep '\.so' 

¿Puede ser lsof – la razor suiza de linux ayudará?

edit: para ejecutar, lsof -p , enumera todo tipo de información útil, por ejemplo, si el proceso es java, enumera todos los jar abiertos, muy bueno …

En realidad, puedes hacer esto en tu código de la siguiente manera:

 #include  using UnknownStruct = struct unknown_struct { void* pointers[3]; struct unknown_struct* ptr; }; using LinkMap = struct link_map; auto* handle = dlopen(NULL, RTLD_NOW); auto* p = reinterpret_cast(handle)->ptr; auto* map = reinterpret_cast(p->ptr); while (map) { std::cout << map->l_name << std::endl; // do something with |map| like with handle, returned by |dlopen()|. map = map->l_next; } 

La estructura link_map contiene al menos la dirección base y el nombre de archivo absoluto. Es la estructura que realmente devuelve dlopen() con primer argumento no dlopen() . Para más detalles, mira aquí .

ltrace parece ser tu amigo.

De ltrace manual:

ltrace es un progtwig que simplemente ejecuta el comando especificado hasta que se cierra. Se intercepta y registra las llamadas de la biblioteca dinámica que son llamadas por el proceso ejecutado y las señales que son recibidas por ese proceso. También puede interceptar e imprimir las llamadas al sistema ejecutadas por el progtwig.

  Its use is very similar to strace(1). 

En Linux, /proc//maps contiene una lista de todos los archivos mapeados en la memoria, que creo que debería incluir cualquier cargada por dlopen() .

En solaris también está el comando pldd.

¿ strace rastreo del archivo de la biblioteca que se está abriendo?

    Intereting Posts