中易网

linux下链接过程中编译器会做哪些工作

答案:1  悬赏:80  
解决时间 2021-03-07 00:53
linux下链接过程中编译器会做哪些工作
最佳答案
1. 预处理
首先源代码文件(.c/.cpp)和相关头文件(.h/.hpp)被预处理器cpp预编译成.i文件(C++为.ii)。预处理命令为:
gcc –E hello.c –o hello.i
预编译过程主要处理那些源代码中以#开始的预编译指令,主要处理规则如下:
u 将所有的#define删除,并且展开所有的宏定义;
u 处理所有条件编译指令,如#if,#ifdef等;
u 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。
u 删除所有的注释//和 ;
u 添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息;
u 保留所有的#pragma编译器指令,因为编译器须要使用它们。
2. 编译
编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件(.s)。编译的命令为:
gcc –S hello.i –o hello.s
或者从源文件直接输出汇编代码文件:
gcc –S hello.c –o hello.s
现在版本的GCC把预编译和编译两个步骤合并成一个步骤,由程序cc1来完成(C++为cc1plus)。
3. 汇编
汇编就是将汇编代码转变成机器可以执行的命令,生成目标文件(.o),汇编器as根据汇编指令和机器指令的对照表一一翻译即可完成。汇编的命令为:
gcc –c hello.s –o hello.o
或者从源文件直接输出目标文件:
gcc –c hello.c –o hello.o
4. 链接
链接就是链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。链接的命令为:
ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o
一般我们使用一条命令就可以完成上述4个步骤:
gcc hello.c
实际上gcc只是一些其它程序的包装,它会根据不同参数去调用预编译编译程序cc1、汇编器as、链接器ld。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
户口簿影印件是什么?
肺活量低对跑步速度有影响吗?我13岁体重45千
正培·台湾商业街这个地址在什么地方,我要处
如何把PDF添加到iBook中
清渠地址有知道的么?有点事想过去
重庆的盛喜床垫公司有注册商标吗
想买款5000左右的自行车,求推荐。
我是一个很没有底气的人,该怎么办
大城锅炉厂在哪里啊,我有事要去这个地方
华硕A555D,打LOL都进不去,不是网络环境差,
补考是不是真的很失败很丢人,我宿舍只有我一
奥雅之光里的游戏币有什么用处
DOTA2天梯出分的十句和之前打得N局有关系吗,
旷庵浜地址在什么地方,想过去办事
以火的危害,怎样防火为中心写一篇感想400字
推荐资讯
沙滩车…十寸轮胎…是指轮毂外径十英寸呢?还
英语同义句 our school has changede a lot i
电池119B和119A有什么区别
永飞糖酒我想知道这个在什么地方
两个大小不同的圆柱形摞在一起上层的小圆柱半
贵州联通省公司正式工待遇怎么样
谁有bl的动漫除《世初》《无法逃离的背叛》《
打人时满16周岁未满18周岁且造成他人轻伤一级
开发商的房屋暂时被银行抵押 要购买此房 开发
戈麦司我想知道这个在什么地方
富士康郑州厂区地址 从汽车客运总站坐几路车
应聘行政人事这类的文员 专业不对口怎么办感
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?