GNU/Linux >> Znalost Linux >  >> Linux

Jak zkontrolovat, jaké sdílené knihovny jsou načteny za běhu pro daný proces?

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...


Linux
  1. Zkontrolovat proces, pokud je stejný?

  2. „který“ ekvivalent pro sdílené knihovny?

  3. Jak zkontrolovat, jaké signály proces poslouchá?

  1. Zkontrolujte limit otevřeného FD pro daný proces v Linuxu

  2. Jak zkontrolovat velikost haldy pro proces v Linuxu

  3. K čemu slouží možnost „soname“ pro vytváření sdílených knihoven?

  1. Jak naplánovat spuštění tcpdump na konkrétní časové období?

  2. Linux top command:What are us, sy, ni, id, wa, hi, si and st (pro využití CPU)?

  3. Jak zkontrolovat, zda je nainstalována sdílená knihovna?