C语言学习笔记之 编译器编译流程

编译器编译流程

  1. 预处理(.i)
  2. 编译(.s)
  3. 汇编(.o)
  4. 链接(.exe .out)

示例文件:main.c

// main.c
#include <stdio.h>
#define NAME 'C'

// 主函数
int main() {
    printf("Hello %c
",NAME);
    return 0;
}

预处理

展开头文件,宏替换,去掉注释,条件编译

命令:

gcc -E main.c -o main.i

main.i最后五行:

# 5 "main.c"
int main() {
    printf("Hello %c
",'C');
    return 0;
}

可以看到,注释已经被去掉,宏也被替换了

编译

检查语法,生成汇编

命令:

gcc -S main.i -o main.s

main.s内容(汇编代码):

	.file	"main.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.section .rdata,"dr"
LC0:
	.ascii "Hello %c12"
	.text
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
LFB13:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$16, %esp
	call	___main
	movl	$67, 4(%esp)
	movl	$LC0, (%esp)
	call	_printf
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE13:
	.ident	"GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 5.3.0"
	.def	_printf;	.scl	2;	.type	32;	.endef

汇编

汇编代码转机器码

命令:

gcc -c main.s -o main.o

此时main.o是二进制文件,不能直接打开
Python中打开内容如下:

b'Lx01x06x00x00x00x00x00xdcx01x00x00x12x00x00x00x00x00x04x01.textx00x00x00x00x00x00x00x00x00x00x00,x00x00x00x04x01x00x00xb4x01x00x00x00x00x00x00x03x00x00x00 x000`.datax00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00@x000xc0.bssx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x80x000xc0.rdatax00x00x00x00x00x00x00x00x00x00x0cx00x00x000x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00@x000@/4x00x00x00x00x00x00x00x00x00x00x00x00x00x00@x00x00x00<x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00@x000@/15x00x00x00x00x00x00x00x00x00x00x00x00x008x00x00x00|x01x00x00xd2x01x00x00x00x00x00x00x01x00x00x00@x000@Ux89xe5x83xe4xf0x83xecx10xe8x00x00x00x00xc7D$x04Cx00x00x00xc7x04$x00x00x00x00xe8x00x00x00x00xb8x00x00x00x00xc9xc3x90x90x90Hello %c
x00x00x00GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 5.3.0x00x00x14x00x00x00x00x00x00x00x01zRx00x01|x08x01x1bx0cx04x04x88x01x00x00x1cx00x00x00x1cx00x00x00x04x00x00x00)x00x00x00x00Ax0ex08x85x02B
x05exc5x0cx04x04x00x00
x00x00x00x10x00x00x00x14x00x19x00x00x00
x00x00x00x06x00x1ex00x00x00x11x00x00x00x14x00 x00x00x00x04x00x00x00x14x00.filex00x00x00x00x00x00x00xfexffx00x00gx01main.cx00x00x00x00x00x00x00x00x00x00x00x00_mainx00x00x00x00x00x00x00x01x00 x00x02x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00.textx00x00x00x00x00x00x00x01x00x00x00x03x01)x00x00x00x03x00x00x00x00x00x00x00x00x00x00x00x00x00.datax00x00x00x00x00x00x00x02x00x00x00x03x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00.bssx00x00x00x00x00x00x00x00x03x00x00x00x03x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00.rdatax00x00x00x00x00x00x04x00x00x00x03x01
x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x19x00x00x00x00x00x00x00x05x00x00x00x03x01?x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00$x00x00x00x00x00x00x00x06x00x00x00x03x018x00x00x00x01x00x00x00x00x00x00x00x00x00x00x00x00x00___mainx00x00x00x00x00x00x00 x00x02x00_printfx00x00x00x00x00x00x00 x00x02x00.x00x00x00.rdata$zzzx00.eh_framex00.rdata$zzzx00.eh_framex00'

链接

链接到一起生成可执行文件

命令:

gcc main.o -o main
原文地址:https://www.cnblogs.com/zhujiangyu/p/13586356.html