程序员的自我修养学习笔记——静态链接

1.静态链接的核心是符号解析和虚拟地址的重定位,全局变量和函数都是以符号的形式存储,使得链接的核心是符号的解析进行地址的重定位,所有的源程序是分别编译的,生成中间目标文件.obj,里面调用的符号是以未定义的形式存在,并且在程序的链接过程中的重定位表中存在,指示当前符号需要重定位,否则就是未包含响应的库或者函数类型不匹配;

2.ABI兼容性问题,ABI涉及到范围比较广泛,包括底层的内存分布模式,符号解析方式等等,就是因为这些差异使得不同编译器生成的库文件之间存在兼容性的问题,这种情况甚至在同一编译器不同版本之间也存在,ABI的差异性是很长一段时间内必须面对的问题,毕竟大型项目无法保证在同一编译器下面生成响应的库文件;

3.全局构造和析构,在main函数之前完成全局对象的初始化,在之后进行对象的销毁工作,在可执行文件中存在响应的段完成其工作

4.静态库本质是中间目标文件的打包以及响应的索引组织,这样我们链接的时候就只需根据引用的关系使用需要的obj项即可,但是这并不等同于直接和这个子文件进行链接就可以实现,同一库类函数和变量在文件中的分布规律比较复杂,还好ld编译器会保证按照需要依次链接相应的符号(这不违背静态链接不能嵌套,因为我们可以把库看成一个可执行文件-进过了链接重定位的步骤,包含的中间目标文件只是它的子项)

5.因为链接过程是以文件为主题链接起来的,所以为了降低可执行文件的大小,和我的想法一致,静态链接运行库里面一个目标文件通常只包含一个函数,如果很多函数被放在同一个目标文件中,则很可能很多没用的函数都被一起链接进了输出结果里,尽可能减少空间的浪费,但需注意粒度太小导致段的开销也是一种损失。

6.windows 内核为一个exe文件 (PE格式可执行文件)ntoskrnl.exe,只有3.8M负责核心处理

你可能感兴趣的:(程序员的自我修养学习笔记——静态链接)