Я не уверен, что я делаю неправильно, но я пробовал читать руководства по соглашениям о вызовах GCC и не нашел там ничего полезного.Моя текущая проблема заключается в том, что GCC генерирует чрезмерно БОЛЬШОЙ код для очень простой операции, как показано ниже.
main.c:
#ifdef __GNUC__
// defines for GCC
typedef void (* push1)(unsigned long);
#define PUSH1(P,A0)((push1)P)((unsigned long)A0)
#else
// defines for MSC
typedef void (__stdcall * push1)(unsigned long);
#define PUSH1(P,A0)((push1)P)((unsigned long)A0)
#endif
int main() {
// pointer to nasm-linked exit syscall "function".
// will not work for win32 target, provided as an example.
PUSH1(0x08048200,0x7F);
}
Теперь давайте создадим и выгрузим его с помощью gcc: gcc -c main.c -Os;objdump -d main.o
:
main.o: file format elf32-i386
Disassembly of section .text:
00000000 <.text>:
0: 8d 4c 24 04 lea 0x4(%esp),%ecx
4: 83 e4 f0 and $0xfffffff0,%esp
7: ff 71 fc pushl -0x4(%ecx)
a: b8 00 82 04 08 mov $0x8048200,%eax
f: 55 push %ebp
10: 89 e5 mov %esp,%ebp
12: 51 push %ecx
13: 83 ec 10 sub $0x10,%esp
16: 6a 7f push $0x7f
18: ff d0 call *%eax
1a: 8b 4d fc mov -0x4(%ebp),%ecx
1d: 83 c4 0c add $0xc,%esp
20: c9 leave
21: 8d 61 fc lea -0x4(%ecx),%esp
24: c3 ret
Это код минимального размера, который я могу получить ... Если я не укажу -O * или не укажу другие значения, он будет иметь длину 0x29 + байт.
Теперь давайте создадим его с помощью компилятора ms c v 6 (да, один из 98 iirc года): wine /mnt/ssd/msc/6/cl /c /TC main.c;wine /mnt/ssd/msc/6/dumpbin /disasm main.obj
:
Dump of file main.obj
File Type: COFF OBJECT
_main:
00000000: 55 push ebp
00000001: 8B EC mov ebp,esp
00000003: 6A 7F push 7Fh
00000005: B8 00 82 04 08 mov eax,8048200h
0000000A: FF D0 call eax
0000000C: 5D pop ebp
0000000D: C3 ret
Как заставить GCC генерировать аналогичный по размеру код?какие-нибудь намеки, советы?Разве вы не согласны, что полученный код должен быть таким маленьким?Почему GCC добавляет так много бесполезного кода?Я думал, что это будет умнее, чем такие старые вещи, как msc6, при оптимизации размера.Что мне здесь не хватает?