Допустим, у меня есть следующая программа C:
int main() {
int a = 1;
int b = 2;
return a + b;
}
Компиляция ее на Compiler Explorer дает мне:
main:
pushq %rbp
movq %rsp, %rbp
movl $1, -4(%rbp)
movl $2, -8(%rbp)
movl -4(%rbp), %edx
movl -8(%rbp), %eax
addl %edx, %eax
popq %rbp
ret
Это (несколько ) аналогично тому, что дает мне компиляция через gcc
, по крайней мере, для части main
. Однако это не будет компилироваться как «автономный», например, если я скопирую и вставлю asm в файл gb.s
и запустил $ gcc gb.s
, я получаю сообщение об ошибке:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol...
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
- если я также не добавлю .globl
вверху, например:
.globl main
Отсюда у меня есть два вопроса:
- Почему компилятор Godbolt не содержит этого вверху или что-то еще, чтобы сделать его самодостаточным?
- Есть ли способ запустить
gcc
и сообщить ему, что main
является основным / глобальным разделом, не помещая .globl main
вверху ?