цель - посмотреть процесс превращения кода на си в исполняемый файл
#include <stdio.h>
int main(){
printf("Hello");
return 0;
}
Обычная компиляция:
$gcc ./main.c -o main.o
$ ./main.o
Hello
.c -> assembler -.> executable file
$gcc -S ./main.c -o ./main.s #превращаем в ассемблерный код
$ as ./main.s -o ./main.o #ассемблируем
$ ld ./main.o #пытаемся линковать, но выскакивает ошибка
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
./main.o: In function `main':
main.c:(.text+0xf): undefined reference to `printf'
#А если пытаемся линковать средствами gcc, то все работает
$ gcc ./main.o
$ ./a.out
Hello
Код на ассмблере на всякий случай.file "main.c"
.section .rodata
.LC0:
.string "Hello"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609"
.section .note.GNU-stack,"",@progbits