2008-11-12 15 views
5

Makine çıkışında incelemek için akılda C kod belirli bir çizgi var, nasıl objdump çıktıda bulun olacaktır. İşte bir örnektebulma yerleri (gcc/objdump -d)

if (cond) 
    foo; 
    bar(); 

ve istediğim gibi çubuğun satır içi olup olmadığını görmek istiyorum. Veya objdump yerine alternatif bir araç kullanır mısın?

cevap

7

Sen -S seçeneği (gibi "objdump -Sd a.out") kullanılarak objdump başlayabilirsiniz. Kodun derlendiği kaynak dosyalarının mevcut olması durumunda, assembler kodu ile karıştırılan kaynak kodunu görüntüler.

Alternatif olarak, aşağıdaki şekilde kullanabilirsiniz: Eğer gcc ile derleme ediyorsanız

int main(void) { 
    int a = 0; 
    asm("#"); 
    return a; 
} 

 .file "a.c" 
     .text 
.globl main 
     .type main, @function 
main: 
     leal 4(%esp), %ecx 
     andl $-16, %esp 
     pushl -4(%ecx) 
     pushl %ebp 
     movl %esp, %ebp 
     pushl %ecx 
     subl $16, %esp 
     movl $0, -8(%ebp) 
#APP 
# 3 "a.c" 1 
     # 
# 0 "" 2 
#NO_APP 
     movl -8(%ebp), %eax 
     addl $16, %esp 
     popl %ecx 
     popl %ebp 
     leal -4(%ecx), %esp 
     ret 
     .size main, .-main 
     .ident "GCC: (GNU) 4.3.2" 
     .section  .note.GNU-stack,"",@progbits 
+2

-S ima eder -d. İkisini de belirtmeniz gerekmiyor. : -P –

+0

Oh, doğru. Ben çok güzel olmayı severim. Biri -D veya -d'nin varsayılan olup olmadığını merak edebilir. Bu, ölü beyni güvenli kılar: p –

1

olur, doğrudan bir montaj dosyası oluşturmak için -S kullanabilirsiniz. Bu dosyada genellikle işlev adları ve bazen kod için satır numaraları (kullandığınız derleme seçeneklerine bağlı olarak) gibi bazı yararlı bilgiler bulunur.

+0

Ayrıca, hem birleştirme dosyası (hem de diğerleri) bir yan ürün olarak derlemek ve oluşturmak için -save-temps kullanabilirsiniz. – CesarB

2

Sen ayıklayıcı ayrıca ayıklama sembolleri ile derlenmiş eğer kaynak kodunu ve eşleşen takımını görmesine izin vermelisin. Bu gcc seçeneği -g ve gdb disass komutu.

0

Fonksiyon çağrıları ortak fonksiyon öndeyiş tarafından mecliste algılanır. i386 ile

o/x86_64 olan benzerdir (sadece dörtlü önek 48) amd64 ile

55  push %ebp 
    89 e5 mov %esp, %ebp 
    ... 
    c9  leave # optional 
    c3  ret 

geçerli:

55     push %rbp 
    48 89 e5    mov %rsp,%rbp 
    .. 
    c9     leaveq # optional 
    c3     retq 

Yani tespit edince sizin objdump -S bla.o veya gcc bla.c -g -fsave-temps -fverbose-asm çıkışı içeride Ana işlevinizin ve çubuğunda da, çubuk çizgisiz değil. Ayrıca, ana bir aramaya sahipse veya numaralı çubuğu atlatmak için satır içi değil. yerel yığın üzerinde odaya ihtiyacı davanız barı yerel değişkenler varsa sen görebiliyordu yılında

. bar yığın ayarlamak satır içi (ör sub $0x8,%esp) bu Var erişebilir, sağ ana Prologun sonra ana yapılır. Değilse bar özeldir.