2012-01-24 9 views
5

Jeśli uruchomię obiekt objdump -d w pliku .o (linux amd64) .o, wywołania funkcji są wyświetlane bez wykonania czasu połączenia. Przykład:objdump i rozwiązywanie powiązań lokalnych wywołań funkcji?

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> 

oddział funkcji pojawia się prawidłowo, ale callq znajduje się w króćcu wprowadzić do łącznika (cztery bajty zer dostępnych linker umieścić odpowiedni adres w).

Czy istnieje sposób, bez faktycznego łączenia, aby uzyskać listę złożenia, która ma nazwy funkcji rozwiązane? Nie interesuje mnie adres, który ostatecznie zostanie użyty, tylko nazwa funkcji. Informacja ta musi znajdować się w pliku .o, ponieważ linker musi ją wykorzystać do wykonania swojej pracy.

Pytam ponieważ wspólne lib, że kod w pytaniu idzie do około 140MB, a to zajmuje długiej czas do uruchomienia objdump -d na tym, by uzyskać zrzut asm z wszystkich wywołań funkcji rozwiązanych do ich faktycznej nazwy.

+0

Mam zorientowali się obejście dla mojego konkretnego problemu. Mogę uruchomić nm, aby uzyskać adres funkcji w naszej ogromnej wspólnej bibliotece, a następnie uruchomić objdump z --start-address przy użyciu tego wyjścia nm. Nadal jednak byłbym zainteresowany odpowiedzią na oryginalne pytanie, jeśli to możliwe. –

Odpowiedz

12

Czy istnieje sposób, bez faktycznego łączenia, aby uzyskać listę złożenia, która ma nazwy funkcji rozwiązane?

Tak: używać objdump -dr foo.o

Powiązane problemy