LOADING

加载过慢请开启缓存,浏览器默认开启

distributed compile

2023/3/30 compile

目标文件.o

.o的结构

1.代码段:包含编译器生成的机器指令,用于执行程序的实际操作。代码段通常是可执行文件中的一部分,但在.o文件中它还需要包含一些调试符号等额外的信息。.text

2.数据段:包含程序中的静态数据,例如全局变量、静态变量、字符串常量等。.data(存放已经初始化了的全局变量和静态变量的段).bss(存放未初始化的全局变量和静态变量的段).rodata(常量)

3.符号表:包含了目标文件中定义和引用的符号(变量名、函数名等)的信息,例如符号的名称、类型、大小等。.symtab

4.重定位表:包含了目标文件中需要进行链接的符号的信息,用于链接器将这些符号链接到其他目标文件中。.rel.text or .rel.data

5.调试信息:包含了源代码和目标代码之间的映射关系、源代码的行号信息以及一些其他的调试信息,方便调试器进行源代码级别的调试。.debug

重定位表

由于我们是文件映射,所以我们只需要把重定位表里的值修改为偏移量+文件起始位置即可

链接器的实现

1.读取目标文件:链接器首先读取所有需要链接的目标文件,包括源代码文件和库文件,以及其他需要链接的目标文件。

2.符号解析:链接器在读取目标文件时,会解析其中的符号信息,包括变量、函数、常量等等。对于每个符号,链接器会记录它的类型、名称、地址等信息。

3.符号重定位:在进行符号解析后,链接器会对每个符号进行重定位,即将符号的地址绑定到实际的内存地址上。这个过程会生成一个符号表,记录每个符号的地址信息。

4.符号合并:如果多个目标文件中存在相同的符号,链接器会将它们进行合并,以避免重复定义的问题。

5.生成可执行文件:最后,链接器会根据符号表和重定位表,将所有目标文件合并为一个可执行文件,并生成对应的链接器脚本和调试信息。

链接器的工作模式

1.符号解析:首先,链接器需要解析目标文件或库文件中的符号,将符号引用与符号定义进行匹配,并生成符号表。符号解析过程可以分为两个阶段,即静态符号解析和动态符号解析。在静态符号解析阶段,链接器将目标文件和库文件中的所有符号和引用都解析为绝对地址,并生成静态符号表。在动态符号解析阶段,链接器将在静态符号表的基础上,再对动态库中的符号进行解析,并生成动态符号表。

2.重定位:链接器根据符号表中的符号信息,将各个目标文件中的代码和数据段进行重定位,生成可执行文件或共享库的代码段、数据段和重定位表。在重定位过程中,链接器将目标文件中引用的符号地址进行修正,以便正确地执行程序。

3.指令合并:链接器将多个目标文件中的代码合并成一个大的代码段,生成可执行文件的代码段。如果存在代码冲突,则需要进行指令重定向和符号重定位,以保证程序能够正常运行。

4.符号绑定:链接器根据符号绑定规则,对符号进行绑定,确定符号的最终地址。在静态链接中,符号绑定通常是在编译时完成的,而在动态链接中,符号绑定则通常是在程序运行时完成的。

5.生成可执行文件或共享库:最后,链接器将重定位后的代码段、数据段和符号表等信息合并生成可执行文件或共享库。在生成可执行文件或共享库时,链接器还需要进行一些其他的操作,例如设置程序入口地址、生成调试信息等。

分布式compiler

distcc

distcc是一种分布式编译工具,它可以让多个计算机协同工作来完成代码的编译工作,从而加快编译速度。下面是distcc的工作原理:

1.用户在本地计算机上启动distcc编译器,并指定要编译的源代码文件。

2.distcc编译器会将源代码文件分成多个小块,并将它们分配给多个远程计算机来编译。

3.远程计算机上的distcc服务接收到编译任务后,会调用本地的编译器来编译源代码,并将编译结果返回给本地计算机。

4.本地计算机收集所有远程计算机返回的编译结果,并将它们组合成一个最终的目标文件。