电子商务网站建设与管理 笔记,做物流的网站都有什么风险,长沙网站自己制作,丁的老头seo博客在 Linux 的动态链接中#xff0c;PLT#xff08;Procedure Linkage Table#xff09; 和 GOT#xff08;Global Offset Table#xff09; 是动态链接机制中的两个关键组件#xff0c;它们一起支持程序动态加载共享库以及在运行时解析符号地址。下面是它们的作用和原理PLTProcedure Linkage Table 和 GOTGlobal Offset Table 是动态链接机制中的两个关键组件它们一起支持程序动态加载共享库以及在运行时解析符号地址。下面是它们的作用和原理
PLTProcedure Linkage Table
作用:
PLT 是一个跳转表用于调用共享库中的函数。它在程序运行时动态解析函数地址从而实现对共享库函数的调用。
工作原理:
当程序第一次调用共享库中的函数时会通过 PLT 跳转到一个 stub 代码段。这个 stub 会将控制权转移到动态链接器(ld.so),动态链接器会在 GOT 中查找或解析目标函数的实际地址然后更新 GOT 的对应条目,之后再次调用同一函数时PLT 会直接从 GOT 中读取已解析的地址并跳转到目标函数。
特点
PLT 本质是间接调用函数的“中介”通过延迟绑定lazy binding减少程序启动时的解析开销。这种动态解析机制可以有效支持动态库的更新而无需重新编译链接主程序。
GOTGlobal Offset Table
作用:
GOT 是一个表存储程序运行时需要使用的全局变量和函数的实际地址。
工作原理:
程序加载时GOT 的条目中存储的是共享库函数的默认入口地址通常指向 PLT 中的 stub当动态链接器解析了实际的函数地址后会更新 GOT 对应的条目使其指向正确的目标函数之后主程序对函数的调用直接通过 GOT 获取实际地址提高效率。
特点
GOT 是程序的数据段.got的一部分它与延迟绑定相结合使得程序可以在运行时动态调整符号地址。
PLT 和 GOT协作完成工作
工作流程 首先主程序中所有对共享库函数的调用都会经过 PLT 跳转。然后PLT 中的第一跳通常指向 GOT 表中的一项。此时GOT 中的条目在未解析时会指向 PLT 中的 stub 地址动态链接器负责更新 GOT 条目。解析完成后GOT 保存目标函数的真实地址后续调用直接通过 GOT 加快速度。
实例 假设程序调用printf函数程序跳转到printfPLT。printfPLT中的代码访问printfGOT条目。如果是第一次调用printfGOT指向 PLT 的解析代码。如果已解析直接跳转到解析后的printf地址。动态链接器解析并填充printfGOT更新为printf的实际地址。
安全性问题pwn 在二进制漏洞利用中如果没有启用RELRORelocation Read-Only机制攻击者可能覆盖 GOT 中的条目将其重定向到恶意代码或者在动态链接完成之前攻击者可能利用未解析的函数地址。
最后如果想深入了解plt和got可以深入分析一个 ELF 文件直接观察它相应段的内容。