Какие параметры компилятора я могу использовать, чтобы получить эту разборку? - PullRequest
0 голосов
/ 22 января 2019

Я обнаружил, что исполняемый файл из кода

int main(int argc, char** argv) {
  printf("Hello World\n");
  return 0;
}

может быть разобран на (скомпилирован с использованием gcc -m32)

Этот код принадлежит другому человеку

; Variables:
        ;    arg_4: 12
        ;    arg_0: 8
        ;    var_4: -4
        ;    var_8: -8
        ;    var_C: -12
        ;    var_10: -16
        ;    var_18: -24
push       ebp
mov        ebp, esp
sub        esp, 0x18
call       _main+11
pop        eax                            ; CODE XREF=_main+6

mov        ecx, dword [ebp+arg_4]
mov        edx, dword [ebp+arg_0]
lea        eax, dword [eax-0x1f5b+0x1fa6] ; "Hello World!\\n"

mov        dword [ebp+var_4], 0x0
mov        dword [ebp+var_8], edx
mov        dword [ebp+var_C], ecx

mov        dword [esp+0x18+var_18], eax  ; method imp___symbol_stub__printf
call       imp___symbol_stub__printf
xor        ecx, ecx                           
mov        dword [ebp+var_10], eax
mov        eax, ecx                                    
add        esp, 0x18                           
pop        ebp
ret

, но когда я дизассемблирую исполняемый файл из того же кода (скомпилирован с использованием gcc -m32)

Я получил очень длинную разборкукод (вот ссылка)

Мои вопросы

  1. Почему инструкции из одного и того же кода отличаются?Или они одинаковые?

  2. Есть ли какой-нибудь вариант компилятора или компилятора, который я могу использовать, который дает мне код разборки, аналогичный тому, который есть у другого человека?

  3. Рекомендуете ли вы какие-либо ссылки, которые я могу прочитать, чтобы понять термины из длинного кода сборки?(например, __x86.get_pc_thunk.dx)

С уважением, Тайсон

1 Ответ

0 голосов
/ 28 января 2019
  1. Вы смотрите на две разные версии разборки.Один - это синтаксис AT & T, а другой - Intel.Кроме того, ссылка содержит всю сборку, а ваш фрагмент содержит только основную функцию.
  2. Параметры компилятора изменят вывод и приведут к дополнительной оптимизации.Большинство дизассемблеров имеют возможность переключать синтаксис (я думаю, что Intel встречается чаще).
  3. Это нечто, сгенерированное GCC, чтобы ваш код мог использовать динамически связанные библиотеки, встроенные в linux / bsd.Thunk предоставляет способ разрешения адресов для функции .
...