C/C++编译原理

  • 整体过程

C源程序——>预编译处理(.c)——>编译、优化程序(.s、 .asm)——>汇编程序(.obj、 .o、 .a、 .ko)——>链接程序(.exe、 .elf、 .axf等)


C/C++编译就是将C/C++的代码映射到相应的机器码,以及讨论其中的内存管理模式,包括内存的分配,如何使用等等,整型、数组、指针等这些在内存中的实现机制。


  • 分点解析

编译将相应的高级语言代码映射到汇编语言,处理define,include等命令,加载外部的代码;


汇编:将汇编语言映射到机器码;该阶段将汇编代码翻译成目标文件,此时的文件为二进制代码。在windows环境下该文件的后缀名为:.obj,但此时的文件是不可执行的,必须通过链接的方式才能够执行;而在在Linux环境下,则对应生成后缀为:.o、 .a、 .ko的文件。 目标文件由段组成。通常一个目标文件中至少有两个段:

代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。

数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。


链接:源文件被翻译成目标代码后需要被链接到一起才能被执行。所以需要形成相应的动态和静态链接库。动态连接库是在程序运行时动态的加载,静态连接库是直接拷贝进入程序,在程序执行时,这些静态连接库加载进来。 


补充

编译单元:根据C++标准,每一个CPP文件就是一个编译单元。每个编译单元之间是相互独立并且互相不可知。


目标文件:由编译所生成的文件,以机器码的形式包含了编译单元里所有的代码和数据,还有一些其他信息,如未解决符号表,导出符号表和地址重定向表等。目标文件是以二进制的形式存在的。


链接器的工作顺序当链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然后访问所有目标文件的地址重定义表,对其中记录的地址进行重定向(加上一个偏移量,即该编译单元在可执行文件上的起始地址)。然后遍历所有目标文件的未解决符号表,并且在所有的导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上填写实现地址。最后把所有的目标文件的内容写在各自的位置上,再作一些另的工作,就生成一个可执行文件。

你可能感兴趣的:(C++)