静态变量、全局变量、局部变量、全局函数、静态函数等地址是如何计算和重定位等?
什么是地址无关代码(PIC)?
为什么有GOT表?
什么ROP(堆栈地址返回覆盖)?
什么是patch code技术?
什么是延迟绑定?
所有外部参数的call,都会走到_dl_runtime_resolve进行符号解析,然后把解析后的地址重新写到GOT表中,这样就完成了延迟绑定了。
什么是PLT(Procedure Linkage Table)表?
_dl_runtime_resolve
依赖两个参数,动态库的ID(GOT表的0x8),要解析的符号在GOT表中的序号,下面通过PLT表来实现给_dl_runtime_resolve传递这两个参数。
经过重定位处理后,就完成了延迟绑定,下一次再调用的时候,就可以直接跳转到函数的地址了。
ld-linux.so的 Loader加载机制
ld-linux.so 对于两个不同的so定义了相同的符号,采取优先匹配原则,优先使用先匹配到的符号