2012-01-24 7 views
5

Se eseguo objdump -d su un file (linux amd64) .o, le chiamate di funzione vengono visualizzate senza la risoluzione del tempo di collegamento terminata. Esempio:objdump e risoluzione del collegamento delle chiamate di funzione locali?

90: 66 89 44 24 1c   mov %ax,0x1c(%rsp) 
    95: 44 89 74 24 10   mov %r14d,0x10(%rsp) 
    9a: e8 00 00 00 00   callq 9f <foo+0x9f> 
    9f: 83 f8 ff    cmp $0xffffffffffffffff,%eax 
    a2: 74 5e     je  102 <foo+0x102> 

Un ramo all'interno della funzione mostra correttamente, ma la callq è solo lo stub messo in per il linker (con quattro byte di zeri disponibili per il linker di inserire un indirizzo corretto in).

C'è un modo, senza effettivamente il collegamento, per ottenere un elenco di assembly che ha risolto i nomi di funzione? Non mi interessa l'indirizzo che verrà utilizzato, solo il nome della funzione. Queste informazioni devono essere nel file .o, dal momento che il linker deve consumarlo per fare il suo lavoro.

chiedo perché il lib condivisa che il codice in questione va in è di circa 140 MB, e ci vuole molto tempoper eseguire objdump -d da quello di ottenere il dump asm con tutte le chiamate di funzione risolti alla loro effettiva nomi.

+0

ho capito una soluzione per il mio problema specifico. Posso eseguire nm per ottenere l'indirizzo della funzione nella nostra enorme lib condivisa, quindi eseguire objdump con --start-address usando quell'output nm. Sarei comunque interessato a una risposta alla domanda originale se è possibile. –

risposta

12

C'è un modo, senza effettivamente il collegamento, per ottenere un elenco di assembly che ha risolto i nomi di funzione?

Sì: utilizzare objdump -dr foo.o

Problemi correlati