这两天看了《程序员的自我修养——链接、装载与库》一书的前三章,感觉还是很有收获的。虽然这本书对于开发一个现成的app来说,貌似没什么作用,但对于理解一个系统软件到底是如何从高级语言代码到跑在硬件上的程序还是很有帮助的。
大部分人都知道我们写的代码要经过预处理、编译、汇编成目标文件,然后经过链接生成最终的可执行文件,但是细节上是怎么一回事就懒得管了。编译的过程我还算有点了解,什么词法分析、语法分析、语义分析之类一系列复杂的步骤,最终得到目标文件,然而链接就完全不知道是怎么一回事了。读这本书前,我曾经一直以为目标文件就是一系列机器码,链接就是把一些库函数嵌入进去,然后程序就可以跑了。直到书中提了一个问题:不同文件中互相调用函数或者全局变量的时候如何确定地址呢?再仔细想,那些调用了别的文件中函数或全局变量的目标文件该如何区分这些变量和自己文件内的静态变量?我顿时感觉链接的过程并没有那么简单,而且目标文件应该也不仅仅是我们写的代码对应的机器码而已,应该也包含了关于函数、变量的信息,而如果要把这一切组织起来,需要更严谨、有效率的文件结构,这就是COFF文件,即Windows