Поиск местоположений в машинном коде (gcc / objdump -d) - PullRequest
5 голосов
/ 12 ноября 2008

Если у вас есть какая-то особая строка кода на C, которую нужно проверить на выходе машины, как бы вы нашли ее в выводе objdump. Вот пример

if (cond)
   foo;
   bar();

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

Ответы [ 4 ]

7 голосов
/ 12 ноября 2008

Вы можете запустить 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 голосов
/ 12 ноября 2008

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

1 голос
/ 12 ноября 2008

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

0 голосов
/ 30 августа 2010

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

С i386 это

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

с amd64 / x86_64 аналогично (только префикс quad 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. Если нет, то это личное сообщение для бара.

...