首页 > 极客资料 博客日记
GOT & PLT 易于理解的个人笔记
2024-08-11 18:00:05极客资料围观25次
文章GOT & PLT 易于理解的个人笔记分享给大家,欢迎收藏极客之家,专注分享技术知识
为什么我们用动态链接和GOT表
- 我们知道静态链接就没那么多事,直接把全部要用的函数都绑定在一起,各个变量和函数之间的偏移量当然能算出来。
- 但是这也恰恰是静态链接的缺点,相同的代码段反复调用真是太臃肿了!
- 于是我们决定把常用的库单独拿出来给大家用,我们还知道,.text是不可修改的,也就是运行的时候可不能再把引用的地址像链接器一样“填”在预留的“坑”里,所以我们还是得装模作样的告诉程序应该跳转到哪里,比如我要call puts,但是我确实不知道puts在哪里(因为动态链接发生在程序运行时),我也留个坑,叫做puts@got。
- got表记录全局偏移,也就是真的存放的位置,放在.data节中所以可以编辑。你只需要知道前三个表项分别是:got[0]保存了.dynamic段的地址,这其中描述了本模块动态链接的相关信息;got[1]保存了该模块的id; got【2】就是真正帮你找你要的函数在哪个地址的,比如他找到了puts在地址0x12345678处,它就填在got[3]。那么以后看到puts@got就直接跳到got[3]的地址(这个id的分配是链接器规划好的)。
为什么我们要延迟绑定和plt表
看起来已经完全解决问题了呀!通过got解决了.text不能编辑的问题,还可以“位置无关”,多棒!
但是请你想象一下,当你执行一个程序,他引用了100000个函数,现在他正在靠got[2]的查找函数一个一个查找......
简直是灾难!很明显正常人都能想到,为什么不“用到的时候”再找呢?你一开头找那么久干什么?万一有个if-else,其中一个分支引用了99%的外部函数,结果我根本就没进入这个分支......
好!现在让我们看下plt的逻辑:
- 当我call puts@plt的时候,我跑到plt代码段执行这些动作:跳到got表,如果第一次调用没人帮我找,那么got表此时的地址就是plt刚刚跳的位置,又回到了plt!
- 那么就继续吧!先压入我要找的函数id,再jmp到plt的公共代码段。
- 公共代码段对于所有plt操作都是一样的,那就是呼唤我们熟悉的got[2]来帮我们找函数。
- got[2]找好以后,它会填入got表中,那么下次再执行步骤1的时候,got表此时的位置就是puts的位置!
- 现在又要用到puts了!我call puts@plt,跳到puts@plt代码段,然后又跳到got表,然后发现居然有人帮我们找好了!
以上内容我相信能帮你轻松的了解plt got的机制,一些专业名词你可以自己搜索。原理懂了看起来方便很多的!
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”