Linux(六)--编译链接原理

一、编译链接原理
我们编译一个程序的过程,其实是由四个步骤组成的,分别是:预编译、编译、汇编、链接。虽然我们现在都是在IDE这种集成开发环境下进行产品的开发,平时也不需要关注程序到底是怎么进行编译链接的,但了解编译链接原理对我们学习编程,以及对我们编写程序有很大帮助,因此,我们十分有必要学习程序的编译链接原理。接下来,我们就从四个步骤开始入手学习。
1、预编译阶段
预编译阶段主要处理那些源代码中以“#”开头的预编译指令,具体如下:
(1)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意:该过程是递归的,也就是说,被包含的文件可能还包含其他文件。
(2)处理所有条件预编译指令,比如“#if",“#ifdef”,"#else",“#endif”。
(3) 进行宏替换,并将所有的“#define”删除。
(4)删除注释,包括“//”和“//”
(5)添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息以及产生编译错误或警告时能够显示行号。
(6)保留所有的“#pragma”编译指令,因为编译器要使用它们。
2、编译阶段
(1)进行一系列词法分析、语法分析和语义分析
(2)进行代码的优化
(3)汇总符号、数据和函数
这个过程是整个程序构建的核心部分,也是最复杂的过程之一。
3、汇编阶段
(1)将汇编指令翻译成二进制的机器指令
(2)生成各个段(section)
(3)生成符号表
4、链接阶段
(1)合并所有文件的各个section,调整段大小以及段的起始位置。
(2)合并符号表,进行符号解析,并给符号分配一个虚拟地址。
(3)进行符号重定位,在源代码中使用符号的地方全都替换成符号的虚拟地址。
每一个步骤都会生成一个中间文件,下面就以一个.c文件为例,说明此过程。
在这里插入图片描述二、可执行文件格式
现在流行的可执行文件格式主要是Windows下的PE(Portable Executable)和Linux下的ELF(Executble Linkable Format),它们都是COFF(Common file format)格式的变种。
目标文件就是源代码进行编译后但未链接的那些中间文件(Windows下的.obj文件和Linux下的.o文件),它跟可执行文件的内容和结构很相似,所以跟可执行文件采用相同的文件格式存储。
在Linux下,可以通过objdumpreadelf命令查看文件的内部信息。
示例:查看各个段信息
(1)目标文件
在这里插入图片描述(2)可执行文件
在这里插入图片描述ELF的结构:
目标文件:
在这里插入图片描述可执行文件:
在这里插入图片描述常用段名的说明
在这里插入图片描述参考文献:《程序员的自我修养》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Serendipity---小ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值