gcc的使用和编译链接原理

gcc全称是GNU Compiler Collection,可以支持多种语言编译,比如C,C++,Java,pascal等

gcc的编译过程

首先建一个main.cpp源程序文件

1.预编译生成main.i文件

1
2
3
4
gcc -E main.cpp -o main.i
//处理预编译指令 #开头的命令,
//除了#pragma lib这个命令,这是链接阶段的,链接用的
//删除注释

2.编译生成.s文件

1
2
3
4
5
6
7
8
9
gcc -S main.i -o main.s
//词法语法解析
//代码优化
//生成符号
/********************
符号表的输出
符号什么时候分配虚拟地址空间?

**********************/

3.汇编生成.o文件(生成可重定位的二进制目标文件.elf)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gcc -c main.s -o main.o
/**************
objdump -o main.o 可以查看.o文件的符号表
.o文件的组成格式
elf文件头
.text
.data
.bss
.symbal
.section table
...
***************/
//将汇编指令翻译成二进制文件
//生成符号表
//生成各个sections
//可重定位:

4.链接生成可执行文件

1
2
3
4
5
6
7
8
gcc main.s -o main
//编译完成的所有.o文件+静态库文件,生成.exe或者.out文件
/**************
1、所有.o文件 段的合并,符号表合并后,进行符号解析
符号解析:所有对符号的引用,都要找到该符号定义的地方
符号解析成功以后,给所有的符号分配虚拟地址
2、符号的重定位(重定向)
***************/

一次性完成

1
2
gcc -o main main.c
//一般生成.o文件,可以让别人使用

gcc常用选项

1
2
3
4
5
6
7
8
9
o	//生成目标	
c //取消链接步骤,编译源码并最后生成目标文件
E //只运行C预编译器(头文件,宏等展开)
S //生成汇编语言文件后停止编译(.s文件)
Wall //打开编译告警(所有)
g //嵌入调试信息,方便gdb调试
llib //链接 lib 库
Idir //增加 include 目录头文件路径
LDir //增加 lib 目录