前端外刊评论 2018-03-07
将符号的引用与定义联系在一起。
#引用信息和定义信息在哪儿,怎么联系在一起的
1)内部符号解析-编译器
2)外部符号解析-连接器
与静态库链接:
链接器维护三个集合(E:可执行文件集合(U:未解析的符号集合(D:已定义的符号集合对于每一个输入的目标文件,通过里面的符号引用与定义信息来修改U、D中的值。对于库文件,若库中的文件成员m中含有对之前 U 中未解析符号的定义,则将m类似目标文件执行操作,直到U、D不再发生变化(如何判断),则将不包含在E中的目标文件舍弃。链接器完成对输入文件的扫描后,如果U非空则触发符号未定义错误。所以输入文件的顺序尤为重要。
#不拷贝代码和数据节
加载时绑定:
调用时绑定:【为了效率】
延迟绑定技术:
第一次调用:引用 -> PLT -> GOT -> PLT -> linker(关键的延迟绑定代码, 回填地址至GOT表中)
之后调用: 引用-> PLT -> GOT -> address
=============================================================
每个可重定位目标文件都有一个符号表,一般的(1本模块全局符号(2本模块函数(3引用的其他模块的全局符号(4非全局符号 会生成符号信息。
符号表数据结构:
重定位表数据结构:
}