Как я могу сказать GCC не выравнивать стек main с 16-байтовой границей? - PullRequest
0 голосов
/ 07 ноября 2018

GCC выполняет вуду, выравнивая стек моего main, сохраняя расположение аргументов в ecx

0x08049060      8d4c2404       lea ecx, [arg_4h]                       ; 4 ; [13] -r-x section size 465 named .text
0x08049064      83e4f0         and esp, 0xfffffff0
0x08049067      ff71fc         push dword [ecx - 4]
0x0804906a      55             push ebp
0x0804906b      89e5           mov ebp, esp
0x0804906d      51             push ecx

А потом,

0x080490a4      8b4dfc         mov ecx, dword [local_4h]
0x080490a7      83c410         add esp, 0x10
0x080490aa      c9             leave
0x080490ab      8d61fc         lea esp, [ecx - 4]
0x080490ae      c3             ret

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

Оба они возвращаются с file,

stack0: исполняемый ELF 32-разрядный LSB, Intel 80386, версия 1 (SYSV), динамически связанный, интерпретатор /lib/ld-linux.so.2, для GNU / Linux 2.6.18,


Я пробовал __attribute__ ((packed)) на основном и #pragma pack, ни один из которых не работал.

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете отключить выравнивание стека, сказав GCC для выравнивания 2 байтов, а не 16

-mpreferred-stack-boundary=2

Скорее всего, это повлияет на производительность.

...