Static Linking静态连接解析
Linking : Linker把多个Obj档加工合并成一个Output档
方法有下列两种
1. 依序累加:
把Input的Obj档依照次序合并起来
Output档依序为ObjA的.text .data .bss section
接下来放ObjB的.text .data .bss section,以此类推
缺点:
浪费空间,以x86来说最小的page为4096bytes
有可能ObjA和ObjB的.text section加起来小于一个page
但是使用此方法却必须放在两个不同的page
2. 相似区段合并:
把所有Obj档的.text合并到输出档的.text section
依序合并.data、.bss这些section
目前static linking采用此方法
目前gcc Linker使用一种叫Two-pass Linking的方法,整个Linking过程分两步骤
1. 分配空间和位置:
先扫描一遍所有的Obj档,计算出各个section所需要
配置的空间大小以及虚拟位置(VMA)
2. 符号解析和重定(relocation) :
对所有使用到的Symbol做调整以及relocation
一般来说,如果我们使用到一些外部变量或是函数。在编译的时候Compiler由于还不知道这些变量和函数的位置,因此会先填一个假的位置到产生出来的指令中
当Linker做Linking的时候,就会去对这些假位置做调整并且换成正确的位置这个动作叫做Relocation
重定表: 纪录哪些指令需要被调整的一张table,可以重定的ELF档中都会有一份table
Static Linking有下列缺点
1. 空间浪费: 每个程序内部都会有printf()、scanf()这些函数
2. 升级困难: 假如要升级某个lib档,必须要对所有使用到这个lib档的程序重新Link。并且重新发布给用户。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
