Ve skutečnosti to můžete ve svém kódu provést následujícím způsobem:
#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;
}
link_map
obsahuje alespoň základní adresu a absolutní název souboru. Je to struktura, kterou ve skutečnosti vrací dlopen()
s prvním argumentem bez NULL. Další podrobnosti naleznete zde.
Ostatní lidé jsou na správné cestě. Zde je několik způsobů.
cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq
Nebo se strace:
strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'
Oba předpokládají, že sdílené knihovny mají někde ve svých cestách ".so", ale můžete to upravit. První poskytuje poměrně pěkný výstup jako seznam knihoven, jednu na řádek. Druhý bude nadále vypisovat knihovny při jejich otevírání, takže to je hezké.
A samozřejmě lsof
...
lsof -p NNNN | awk '{print $9}' | grep '\.so'
Může být lsof
- pomůže švýcarský armádní nůž linuxu?
edit:spustit, lsof -p <pid>
, uvádí všechny druhy užitečných informací, například pokud je proces java, uvádí seznam všech otevřených nádob - velmi cool...