共享对象与代码模型:深入解析与实践案例
1. .got.plt 节分析
在程序运行过程中,.plt 节的起始地址有着重要作用。它对应着所有 PLT 条目共享的“通用”代码,会将一个 GOT 值压入栈中,并从 GOT 获取动态加载器的地址以进行跳转。通过 objdump 输出的注释可知,最后两个值对应的地址为 0x601008 和 0x601010,这些值存储在 .got.plt 节中,该节是与 PLT 条目相关的 GOT 部分。以下是 .got.plt 节的内容:
Contents of section .got.plt:
0x601000 180e6000 00000000 00000000 00000000
0x601010 00000000 00000000 86054000 00000000
0x601020 96054000 00000000
从地址 0x601018 开始的字节为 86 05 40 00 00 00 00 00 ,由于 Intel 64 采用小端字节序,实际存储的四字为 0x400586,这正是 libfun@plt + 6 的地址,也就是 push 0x0 指令的地址。这表明 GOT 中函数的初始值指向其各自 PLT 条目的第二条指令。
2. 预加载(Preloading)
设置 LD_PRELOAD 变量可以在加载其他库(包括 C 标准库)之前预加载共享对象。该库中的函数在查找时具有优先级,能够覆盖正常加载
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



