2008-11-12 2 views
5

Если у вас есть определенная строка кода C для изучения на выходе машины, как вы можете найти ее в выводе objdump. Вот пример:Поиск местоположений в машинных кодах (gcc/objdump -d)

if (cond) 
    foo; 
    bar(); 

, и я хочу посмотреть, был ли бар вложен, как хотелось бы. Или вы бы использовали альтернативный инструмент вместо objdump?

ответ

7

Вы можете запустить objdump, используя опцию -S (например, "objdump -Sd a.out"). Он будет отображать исходный код, смешанный с кодом ассемблера, если исходные файлы, из которых был скомпилирован код, доступны.

В качестве альтернативы можно использовать следующим образом:

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 означает -d. Вам не нужно указывать оба. :-P – 2008-11-12 03:43:45

+0

О, право. Мне нравится быть многословным. Можно задаться вопросом, является ли значение -D или -d значением по умолчанию. Это делает его безопасным с мертвой точки: p – 2008-11-12 03:48:27

1

Если вы компиляции с GCC, вы можете использовать -S для создания файла сборки непосредственно. Обычно этот файл содержит полезную информацию, включая имена функций и иногда номера строк для кода (в зависимости от используемых вами параметров компиляции).

2

Отладчик также должен видеть исходный код и соответствующую сборку, если вы скомпилированы с помощью отладочных символов. Это опция gcc -g и gdb disass.

0

Функциональные вызовы обнаруживаются в сборке с помощью пролога общей функции.

С i386 это

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

с amd64/x86_64 это похоже (только квадро префикс 48):

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

Итак, когда вы обнаружили, что внутри вашего objdump -S bla.o или gcc bla.c -g -fsave-temps -fverbose-asm выход вашей основной функции , а также для бара, балка не включена. Также, когда у главного есть вызов или прыжок , чтобы он не был привязан.

В вашем случае вы можете увидеть, есть ли в баре местные вары, которым нужен номер на локальном стеке. Если бар встраивается, корректировка стека (например, sub $0x8,%esp) выполняется сразу после основного пролога, main может получить доступ к этому var. Если нет, то это запрещено.

 Смежные вопросы

  • Нет связанных вопросов^_^