编译链接过程(三)

来源:互联网 发布:好书推荐知乎 编辑:程序博客网 时间:2024/05/14 14:25

经过前两篇博文可以大体了解到源程序是如何变成目标文件的。但是目标文件并不是可执行文件,它们之间还是有些差别,虽然在文件的格式上非常相似,都是ELF(Linux)或PE(Widows)文件格式,具体这两种格式之间的联系与区别后面再做了解。每一个源文件如×××.c或者×××.cpp称为一个编译单元,它们将生成一个对应的目标文件×××.o。多个目标文件和这个可执行文件可能调用到的共享库文件(×××.so)一起经过链接过程,生成可执行文件。

这里就表明了链接的意义了。随着软件规模的不断扩大,将所有代码都写在一个文件里,就会使得程序非常符,不利于维护,也不容易保证程序的正确性。解决的方法是将程序划分成功能相关的模块,每个模块可以写在一个源文件中,模块之间的通信机制是通过全局变量或者函数调用来完成的。那么在编译某个文件时(编译对应的模块),此文件要访问的全局变量的地址未知,汇编代码该如何确定呢?变量和函数都被指定了符号,将这些在编译时无法确定地址的符号归总,放到一起(重定位表),待它们所定义的模块编译完成之后(变量和函数的地址确定),再重新计算,然后后写回到各模块中。这一过程就是链接。这需要目标文件的格式做好合理的安排,链接时到指定的地方去寻找哪些符号要重定位以及它们的地址要被写入到哪个位置。

0 0
原创粉丝点击