GCC:从源文件到可执行文件

GCC:从源文件到可执行文件

假设我们有hello.c 文件

#include <stdio.h>
int main(){
	printf("hello world!\n");
	return 0;
}

怎么在linux上利用GCC命令生产可执行文件(单文件编译)呢?

一、流程

C文件从源文件到可执行文件大致要经历四个阶段:

预处理 -> 编译 -> 汇编 ->链接

文件后缀从.c -> .i -> .s ->.o -> 无后缀

对应一图流:

**预处理:**预处理器(cpp)主要根据include命令将头文件内容直接插入文本中,得到的文件拓展名为 .i

**编译阶段:**编译器(ccl)将c语言翻译成汇编语言,得到汇编代码文件拓展名为 .s

**汇编阶段:**汇编器(as)将汇编语言翻译成机器语言,得到二进制目标文件拓展名为 .o

**链接阶段:**链接器(ld)将多个.o文件链接生产可执行文件,通常无后缀

二、GCC命令与流程

预处理:

gcc -E hello.c

-E选项表示只进行预处理。

这条命令执行之后会将预处理的结果直接输出到终端,若要保存,请执行下条命令

gcc -E hello.c -o hello.i

-o选项代指定输出文件名。

这条命令执行后,会生成hello.i文件到当前目录。

编译:

gcc -S hello.i

-S选项表示只进行编译。

这条命令执行后会生成hello.s文件。

汇编:

gcc -c hello.s

-c选项表示进行预处理、编译与汇编。

这条命令执行后会生成hello.o文件。

链接:

gcc hello.o

这条命令执行后默认会生成a.out文件。

若要指定文件名,请执行下条命令

gcc -o hello hell.o

执行:

./a.out
./hello

终端上会打印hello world!字样。

三、其他

gcc其实可以一步到位生成可执行文件

gcc hello.c

默认生成 a.out 文件。

https://www.cnblogs.com/bobwuming/articles/14931042.html

一:预处理阶段(cpp)

gcc -E hello.c -o hello.i

主要作用:

处理关于 “#” 的指令

【1】展开所有宏定义,删除#define。例#define portnumber 3333

【2】处理条件预编译 #if, #ifdef, #if, #elif,#endif

【3】处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可是递归进行的,文件内可能包含其他“.h”文件。

【4】删除所有注释。/**/,//。

【5】添加行号和文件标识符。用于显示调试信息:错误或警告的位置。

【6】保留#pragma编译器指令。(1)设定编译器状态,(2)指示编译器完成一些特定的动作。

二,编译阶段(ccl)(编译器主要做了什么)

gcc -s hello.c -o hello.s

主要作用:1.扫描(词法分析),2.语法分析,3.语义分析,4.源代码优化(中间语言生成),5.代码生成,目标代码优化。

【1】将源代码程序输入扫描器,将源代码的字符序列分割成一系列记号。例array[index] = (index + 4) * (2 + 6);

【2】基于词法分析得到的一系列记号,生成语法树。

【3】由语义分析器完成,指示判断是否合法,并不判断对错。又分静态语义:隐含浮点型到整形的转换,会报warning,动态语义:在运行时才能确定:例1除以3

【4】中间代码(语言)使得编译器分为前端和后端,前端产生与机器(或环境)无关的中间代码,编译器的后端将中间代码转换为目标机器代码,目的:一个前端对多个后端,适应不同平台。

【5】编译器后端主要包括:代码生成器:依赖于目标机器,依赖目标机器的不同字长,寄存器,数据类型等目标代码优化器:选择合适的寻址方式,左移右移代替乘除,删除多余指令。

三,汇编阶段(as)

gcc -c hello.c -o hello.o

主要作用:汇编器是将汇编代码转变成可以执行的指令,生成目标文件。

四,链接阶段(ld)

gcc hello.o -o hello

主要作用:通过编译器的5个步骤后,我们获得目标代码,但是里面的各个地址还没有确定,空间还没有分配。

链接过程主要包括:地址和空间的分配,符号决议和重定位。

地址和空间:略

符号决议:也可以说地址绑定,分动态链接和静态链接,

重定位:假设此时又两个文件:A,B。A需要B中的某个函数mov的地址,未链接前将地址置为0,当A与B链接后修改目标地址,完成重定位。

四、GCC的更多选项

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值