2012-01-24 26 views
5

Bir (linux amd64) .o dosyasında objdump -d çalıştırırsam, işlev çağrıları bağlantı zaman çözünürlüğü yapılmadan görünür. Örnek: işlev içinde bir dalı düzgün gösterir, ancak callq linker koymak sadece taslaktırYerel işlev çağrılarının amacı nedir?

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> 

(bağlayıcı için sıfır dört bayt ile bir uygun adres koymak için).

İşlev adlarının çözülmüş olduğu bir derleme listesi almak için aslında bağlantı kurmadan bir yol var mı? Sonunda kullanılacak olan adresi umurumda değil, sadece işlevin adı. Bu bilgi .o dosyasında olmalı, çünkü linker işini yapmak için tüketmelidir. Söz konusu kod gider paylaşılan lib 140MB hakkında çünkü

ben sormak ve onların fiili karar tüm işlev çağrıları ile asm Dökümü almak için bu konuda -d objdump çalıştırmak için uzun zaman alır isimler.

+0

kullanın. Devasa paylaşılan libomuzda fonksiyon adresini almak için nm'yi çalıştırabilir ve sonra o nm çıktısını kullanarak --start-address ile objdump'ı çalıştırabilirim. Yine de, orijinal soruya bir cevapla ilgilenmek isterim. –

cevap

12

İşlev adlarının çözülmüş olduğu bir derleme listesi almak için aslında bağlantı kurmadan bir yol var mı?

Evet: Ben belirli bir soruna yönelik geçici çözüm anladım objdump -dr foo.o