首页 > 其他分享 >GOT & PLT 易于理解的个人笔记

GOT & PLT 易于理解的个人笔记

时间:2024-08-11 17:50:21浏览次数:9  
标签:plt 函数 puts 笔记 PLT 代码段 got GOT 链接

为什么我们用动态链接和GOT表

  1. 我们知道静态链接就没那么多事,直接把全部要用的函数都绑定在一起,各个变量和函数之间的偏移量当然能算出来。
  2. 但是这也恰恰是静态链接的缺点,相同的代码段反复调用真是太臃肿了!
  3. 于是我们决定把常用的库单独拿出来给大家用,我们还知道,.text是不可修改的,也就是运行的时候可不能再把引用的地址像链接器一样“填”在预留的“坑”里,所以我们还是得装模作样的告诉程序应该跳转到哪里,比如我要call puts,但是我确实不知道puts在哪里(因为动态链接发生在程序运行时),我也留个坑,叫做puts@got。
  4. 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的逻辑:

  1. 当我call puts@plt的时候,我跑到plt代码段执行这些动作:跳到got表,如果第一次调用没人帮我找,那么got表此时的地址就是plt刚刚跳的位置,又回到了plt!
  2. 那么就继续吧!先压入我要找的函数id,再jmp到plt的公共代码段。
  3. 公共代码段对于所有plt操作都是一样的,那就是呼唤我们熟悉的got[2]来帮我们找函数。
  4. got[2]找好以后,它会填入got表中,那么下次再执行步骤1的时候,got表此时的位置就是puts的位置!
  5. 现在又要用到puts了!我call puts@plt,跳到puts@plt代码段,然后又跳到got表,然后发现居然有人帮我们找好了!

以上内容我相信能帮你轻松的了解plt got的机制,一些专业名词你可以自己搜索。原理懂了看起来方便很多的!

标签:plt,函数,puts,笔记,PLT,代码段,got,GOT,链接
From: https://www.cnblogs.com/muyiGin/p/18353677

相关文章

  • PointNet++笔记
    pointnet++论文题目为:PointNet++:DeepHierarchicalFeatureLearningonPointSetsinaMetricSpace。在这篇文章中,作者对pointnet进行了一些改进,因为原始的pointnet对于规模较大的点云时,性能就显得不够了。在论文的摘要开头也指出了这一点:“However,bydesignPointNetdo......
  • 【学习笔记】Matlab和python双语言的学习(图论最短路径)
    文章目录前言一、图论基本概念示例二、代码实现----Matlab三、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187QF?p=36&vd_source=67471d3a1b4f517b7a7964093e62f7e6一、图论图论(G......
  • 【C++学习笔记 16】构造函数初始化列表
    当编写类并向其中添加成员时,通常需要某种方式对这些成员进行初始化。常见的方法,如写一个构造函数赋初值classEntity{private: std::stringm_Name;public: Entity(){ m_Name="UnKnow"; } Entity(conststd::string&name){ m_Name=name; } constst......
  • 算法笔记|Day22回溯算法IV
    算法笔记|Day22回溯算法IV☆☆☆☆☆leetcode491.递增子序列题目分析代码☆☆☆☆☆leetcode46.全排列题目分析代码☆☆☆☆☆leetcode47.全排列II题目分析代码☆☆☆☆☆leetcode332.重新安排行程(待补充)题目分析代码☆☆☆☆☆leetcode51.N皇后(待补充)题目分析......
  • 论文笔记:GeoShapley: A Game Theory Approach toMeasuring Spatial Effects in Machin
    (GeoShapley:机器学习模型中测量空间效应的博弈论方法)话题点:geoshapley、XAI、空间效应、非线性一、引言机器学习和人工智能(AI)越来越多地用于模拟地理空间现象,在各个领域都有很好的表现。可解释人工智能(XAI)领域的最新进展为解释黑箱机器学习提供了一种解决方案。排列特征......
  • 高等数学学习笔记(一)
    高等数学学习笔记最近入门了高等数学,特此记录一下学习到的重点。Chapter1实数与实数集这部分内容高中已经接触过很多了,仅补充一些未曾了解过的。1.完备性实数集不仅对加减乘除开方运算封闭,并且对于极限运算也封闭,这个性质被称为“完备性”。实数中的集合通常称为数集。2.......
  • 李宏毅-机器学习-笔记-P1
    P1机器学习基本概念(一)一、机器学习是什么?        MachineLearning≈Lookingforfunction、函数太过复杂,让机器来找比如:SpeechRecognition(语音识别):声音信号通过函数转化为文字,输入到输出      ImageRecognition(图像识别)、PlayingGo二、着重关......
  • 深入浅出!这份阿里内传的“Spring-MVC源码分析与实践笔记”带你看透Spring-MVC源码!太牛
    第二章常见协议和标准DNS协议TCP/IP协议与SocketHTTP协议Servlet与JavaWeb开发第三章DNS的设置DNS解析Windows7设置DNS服务器Windows设置本机域名和IP的对应关系第四章Java中Socket的用法普通Socket的用法NioSocket的用法第五章自己动手实现HTTP协议第六......
  • 汇编语言第二章寄存器(笔记、习题及拓展知识)(王爽汇编语言第四版)
    一、寄存器基础知识​一个典型的CPU(此处讨论的不是某一具体的CPU)由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连。前一章所说的总线,相对于CPU内部来说是外部总线。内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联......
  • HTB-Permx靶机笔记
    Permx靶机笔记概述permx靶机是HTB的简单靶机,这台靶机整体考验渗透人员的信息搜集能力,可以收只有信息搜集的快速,才能快速拿到它的flag。整体是比较简单的靶机靶机连接:https://app.hackthebox.com/machines/PermX一、nmap扫描1)端口扫描nmap-sT--min-rate10000-p--......