文章目录
目录
文章目录
前言
一、程序编译的过程
二、编译阶段
1.预处理(*.i)
2.编译(*.s)
3.汇编(*.o)
4.链接
总结
前言
提示:使用vs code(gcc编译器)与vs2022来演示c语言的预处理
提示:以下是本篇文章正文内容,下面案例可供参考
一、程序编译的过程
二、编译阶段
以下是使用vscode——gcc编译器
1.预处理(*.i)
test.c
#include <stdio.h>
#include "test.h"
extern int add(int x,int y);
int main()
{
//代码
int x=10;
int y=20;
int sum = add(x,y);
printf("%d",sum);
return 0;
}
test.h
typedef struct test
{
int b;
char a;
}test1;
我们使用指令编译——》
gcc -E test.c -o test.i
会得到一个*.i的文件
过后我们会看见一个test.i的文件
这个就是预处理文件
内容为下:
分析:
它把test.h和test.c的文件合并在一了并且把注释删除了(还会把#define 宏的符号替换或者删除)【这里没有展现出了,你们可以试试看】
总结:
是有用可用的保留,无用的删除——文本操作
2.编译(*.s)
gcc -c test.i
把预编译文件——》编译文件*.s
会得到汇编代码
如下
.file "test.c"
.text
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "%d\0"
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
call __main
movl $10, -4(%rbp)
movl $20, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %eax
movl %eax, %ecx
call add
movl %eax, -12(%rbp)
movl -12(%rbp), %eax
movl %eax, %edx
leaq .LC0(%rip), %rcx
call printf
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0"
.def add; .scl 2; .type 32; .endef
.def printf; .scl 2; .type 32; .endef
分析:
把c语言转变为汇编
其中有语法分析,语义分析,词法分析,符号分析等
3.汇编(*.o)
gcc -c test.s
把汇编文件变成二进制
4.链接
每一个目标文件由链接器捆绑在一起,形成一个可执行的程序。
1.合并段表
2.符号表的合并和符号表的定位