C++:编译链接原理

当我们使用命令来编译一个源代码文件时,通常包括4个步骤:预编译编译汇编链接。如下图所示:

             

1、预编译

 预编译:源代码文件(.cpp或.cxx)和相关的头文件(.h)被预编译器cpp预编译成一个.i文件。第一步预编译的过程相当于以下命令:

         gcc -E hello.c -o hello.i    或 cpp hello.c > hello   (-E表示只进行预编译)

预编译过程主要处理源代码文件中以“#”开始的预编译指令,主要处理规则如下:

1、将所有的“#define”删除,并文本替换,展开所有的宏定义

2、处理所有条件预编译指令,比如“#if”、“#ifdef”、“#else”、“#endif”

3、处理“#include”预编译指令,将被包含的文件递归插入到该预编译指令位置

4、删除所有的注释

5、添加行号和文件标识

6、保留所有的 #pragma 编译器指令

2、编译

编译:把预编译完成的文件进行一系列的词法分析语法分析语义分析代码优化,最后生成相应的汇编指令。编译过程相当于以下命令:

gcc -s hello.i -o hello.s    或  gcc -s hello.c -o hello.s(使用cc1程序将预编译和编译过程合二为一)

词法分析:将源代码程序输入扫描器中,使用一种类似“有限状态机”的算法将源代码的字符序列分割成一系列的记号,再将记号放到相应的位置。

语法分析:使用语法分析器,采用“上下文无关语法”的分析手段对记号进行语法分析,从而产生语法树。仅是完成了对表达式的语法层面的分析,不了解语句是否真正有意义。

语义分析:使用语义分析器,分析语句是否有意义。语义分析包括静态语义和动态语义。静态语义指在编译期间可以确定的语义,通常包括声明、类型的匹配和转换;动态语义指只有在运行期间才能确定的语义。

代码优化:目标代码优化器对目标代码进行优化,比如选择合适的寻址方式、使用位移代替乘法,删除多余的指令等。

3、汇编

汇编:是使用汇编器将汇编代码转换成机器码的过程。可以调用汇编器as完成:

          as hello.s -o hello.o      或 gcc -c hello.s -o hello.o

或使用gcc命令从源代码开始,经过预编译、编译和汇编直接输出目标文件:

          gcc -c hello.c -o hello.o

4、链接

链接:主要内容是把各个模块之间相互应用的部分处理好,使得各个模块之间能够正确的衔接。

 1、合并段和符号表

 2、符号解析

 3、分配地址和空间

 4、符号重定位

最基本的静态链接过程如图,每个模块的源代码文件经过编译器编译生成目标文件,目标文件和库一起链接形成最终的可执行文件。

5、运行

1、建立虚拟地址空间和物理内存之间的映射(创建映射结构体:PCB;创建页目录、页表)

2、加载指令和数据到内存中

3、将入口地址(虚拟地址)写入下一行指令寄存器中

 

 

 

    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值