2008-11-12 32 views
5

Nếu bạn có một dòng mã C cụ thể để kiểm tra trong đầu ra của máy, bạn sẽ định vị nó như thế nào trong đầu ra objdump. Dưới đây là ví dụTìm các vị trí trong mã máy (gcc/objdump -d)

if (cond) 
    foo; 
    bar(); 

và tôi muốn xem thanh có được inlined như tôi muốn không. Hoặc bạn sẽ sử dụng một số công cụ thay thế thay vì objdump?

Trả lời

7

Bạn có thể bắt đầu objdump bằng cách sử dụng tùy chọn -S (như "objdump -Sd a.out"). Nó sẽ hiển thị mã nguồn được trộn lẫn với mã bộ mã hóa, nếu các tập tin mã nguồn được biên dịch từ có sẵn.

Ngoài ra, bạn có thể sử dụng các cách sau:

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

trở thành

 .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 ngụ ý -d. Bạn không cần phải chỉ định cả hai. :-P –

+0

Ồ, đúng vậy. Tho Tôi thích được tiết lộ. Người ta có thể tự hỏi liệu -D hay -d là mặc định. Điều này làm cho nó chết não an toàn: p –

1

Nếu bạn đang biên soạn với gcc, bạn có thể sử dụng -S để tạo ra một file lắp ráp trực tiếp. Tệp này thường có một số thông tin hữu ích trong đó, bao gồm tên hàm và đôi khi là số dòng cho mã (tùy thuộc vào các tùy chọn biên dịch bạn sử dụng).

+0

Bạn cũng có thể sử dụng tiết kiệm-temps để biên dịch cả hai và tạo ra các tập tin lắp ráp (và những người khác) như một sản phẩm phụ. – CesarB

2

Bạn trình gỡ lỗi cũng sẽ cho phép bạn xem mã nguồn và lắp ráp phù hợp nếu bạn biên dịch bằng các biểu tượng gỡ lỗi. Đây là lệnh gcc option -g và gdb disass.

0

Các cuộc gọi chức năng được phát hiện trong assembly bằng hàm prolog chung.

Với i386 nó là

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

với amd64/x86_64 là tương tự (chỉ là quad tiền tố 48):

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

Vì vậy, khi bạn phát hiện rằng bên objdump -S bla.o hoặc gcc bla.c -g -fsave-temps -fverbose-asm đầu ra của bạn chức năng chính của bạn và đối với thanh cũng vậy, thanh không được gạch chân. Ngoài ra khi chính có một cuộc gọi hoặc nhảy để chặn nó không phải là inlined.

Trong trường hợp của bạn, bạn có thể xem thanh có biểu tượng cục bộ hay không, cần phòng trên ngăn xếp cục bộ. Nếu thanh được gạch chân thì điều chỉnh ngăn xếp (ví dụ: sub $0x8,%esp) được thực hiện ngay sau prolog chính, chính có thể truy cập vào var đó. Nếu không phải là riêng tư để thanh.

Các vấn đề liên quan