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




programacion android pdf 2018 (6)

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

#include <link.h>

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<UnknownStruct*>(handle)->ptr;
auto* map = reinterpret_cast<LinkMap*>(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 here .

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

Para ser más específico, si un programa 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?


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


En solaris también está el comando pldd.


¿Puede ser lsof - la navaja suiza de linux ayudará?

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


ltrace parece ser tu amigo.

De ltrace manual:

ltrace es un programa 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 programa.

       Its use is very similar to strace(1).

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





shared-libraries