2009-07-14 19 views

risposta

35

ldd <exe filename> mostra dinamicamente collegati librerie

nm <exe filename> mostra i simboli nel file.

Per vedere quali simboli provengono da librerie statiche è necessario eseguire nm contro quelle librerie per ottenere un elenco dei simboli (funzioni, ecc.) In esse, quindi confrontarle con l'elenco di simboli da nm <exe filename>.

Si confrontano gli elenchi con il comando comm. Vedi man comm per i dettagli.

Questo è stato preso da questo forum here.

+2

Come @Goz e anon puntano, questo funziona solo se il file binario non è stato rimosso/contiene informazioni di debug. I nomi non sono necessari (e nemmeno utilizzati) dopo che una libreria statica è stata collegata a un'applicazione: le chiamate sono tutte per indirizzo. –

+0

Questo non risponde alla domanda. "eseguire nm contro quelle librerie" non è possibile se non si conoscono le librerie; e ci sono librerie usate implicitamente nel collegamento. – kavadias

+0

Se è un binario sconosciuto, non sappiamo quali librerie sono presenti. Quindi "correre nm contro quelle librerie" sembra controproducente. – goldenmean

10

No, i nomi delle librerie vengono scartati durante il processo di collegamento. Tuttavia, se il tuo eseguibile contiene informazioni di debug (cioè è stato compilato con il flag -g), potresti essere in grado di ottenere informazioni da questo.

+0

Non c'è modo di discernere l'ASM RAW, o l'ottimizzazione del compilatore e le modifiche influiscono anche su questo? – MrMesees

5

A meno che un determinato compilatore non memorizzi una sorta di metadati all'interno del file binario, no. Una libreria statica è un codice che viene compilato direttamente nel file binario.

6

Se si dispone del codice sorgente e non si desidera passare attraverso tutto il codice per questo, è possibile generare il file di mappa durante la compilazione per sapere quali librerie statiche sono collegate.

Ad esempio g++ -Xlinker -Map=a.map main.c, controllare il file della mappa per informazioni sulle librerie statiche collegate.

2

Non esiste alcun modo per ottenere l'elenco di librerie statiche all'interno di alcuni eseguibili ELF.

Perché per il linker, una libreria statica viene semplicemente utilizzata come un insieme di membri "pigri". Quindi l'eseguibile ELF risultante conterrebbe solo i membri necessari per collegarlo. Quindi membri come foo2.o di libfoo.a sono collegati come se il file oggetto foo2.o fosse collegato nell'eseguibile (ammesso che sia necessario un simbolo definito in foo2, ad esempio in cui si fa riferimento da qualche parte).

Naturalmente, utilizzando nm o objdump o readelf, o su qualche strings eseguibile ELF può dare alcuni suggerimenti su ciò che i file oggetto (inclusi quelli provenienti da statiche librerie) sono al suo interno, perché vedrete simboli definito in (membri di) quelle librerie statiche (o stringhe letterali utilizzate al loro interno).

+1

che tipo di suggerimenti intendi? Puoi dare degli esempi? Puoi indicarmi la fonte dove posso trovare più di questi suggerimenti? – stackoverflowwww

+1

L'utilizzo di readelf, ad esempio, mostrerà funzioni, oggetti, simboli utilizzati nel file binario. Questi possono servire come suggerimenti per trovare le librerie che sono state utilizzate. Ad esempio si può vedere la funzione Curl_http e sapere che libcurl è molto probabilmente usato dal binario e se non è collegato in modo dinamico deve essere collegato staticamente. – ohgodnotanotherone

Problemi correlati