GNU/Linux >> Linux Esercitazione >  >> Linux

Come verificare quali librerie condivise vengono caricate in fase di esecuzione per un determinato processo?

In realtà, puoi farlo nel tuo codice nel modo seguente:

#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;
}

Il link_map La struttura contiene almeno l'indirizzo di base e il nome file assoluto. È la struttura effettivamente restituita da dlopen() con primo argomento diverso da NULL. Per maggiori dettagli vedi qui.


Altre persone sono sulla strada giusta. Ecco un paio di modi.

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

Oppure, con strace:

strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'

Entrambi presumono che le librerie condivise abbiano ".so" da qualche parte nei loro percorsi, ma puoi modificarlo. Il primo fornisce un output abbastanza carino come un semplice elenco di librerie, una per riga. Il secondo continuerà a elencare le librerie man mano che vengono aperte, quindi è carino.

E ovviamente lsof ...

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

Potrebbe essere lsof - il coltellino svizzero di Linux aiuterà?

modifica:per eseguire, lsof -p <pid> , elenca tutti i tipi di informazioni utili, ad esempio, se il processo è java, elenca tutti i barattoli aperti - molto interessante...


Linux
  1. "quale" equivalente per le biblioteche condivise?

  2. Controlla quanto tempo impiega uno script Bash per essere eseguito con il comando Time

  3. Come eseguire il processo Rsync in background

  4. Come controllare la dimensione dell'heap per un processo su Linux

  5. A cosa serve l'opzione 'soname' per la creazione di librerie condivise?

Come eseguire un comando per un tempo specifico in Linux

Come eseguire l'applicazione per un determinato periodo di tempo in Shell?

A cosa servono i file .la di libtool?

Come faccio a sapere cosa vengono esportati tutti i simboli da un oggetto condiviso?

Controlla il limite FD aperto per un determinato processo in Linux

Comando principale di Linux:cosa siamo noi, sy, ni, id, wa, hi, si e st (per l'utilizzo della CPU)?