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;
}
El link_map
estructura contiene al menos la dirección base y el nombre de archivo absoluto. Es la estructura que en realidad devuelve dlopen()
con primer argumento no NULL. Para obtener más detalles, consulte aquí.
Otras personas están en el camino correcto. Aquí hay un par de formas.
cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq
O, con strace:
strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'
Ambos asumen que las bibliotecas compartidas tienen ".so" en algún lugar de sus rutas, pero puede modificar eso. El primero da un resultado bastante bonito como una lista de bibliotecas, una por línea. El segundo seguirá enumerando las bibliotecas a medida que se abren, así que está bien.
Y por supuesto lsof
...
lsof -p NNNN | awk '{print $9}' | grep '\.so'
Puede ser lsof
- ¿La navaja suiza de Linux ayudará?
editar:para ejecutar, lsof -p <pid>
, enumera todo tipo de información útil, por ejemplo, si el proceso es Java, enumera todos los archivos jar abiertos, muy bueno...