首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否每个.so文件都有PLT/GOT?

每个.so文件都有PLT/GOT,其中PLT(Procedure Linkage Table)和GOT(Global Offset Table)是用于实现动态链接的重要数据结构。

PLT是一个函数指针数组,用于存储.so文件中的函数地址。当.so文件被加载到内存中时,PLT会被初始化,其中的函数指针会被填充为一个特殊的跳转指令,该指令会在第一次调用函数时跳转到GOT中对应函数的地址。

GOT是一个全局偏移表,用于存储.so文件中的全局变量和函数的地址。在.so文件被加载到内存中时,GOT会被初始化,其中的地址会被填充为对应函数或变量的真实地址。

通过PLT和GOT的结合使用,可以实现.so文件中函数和变量的动态链接。当程序调用.so文件中的函数时,会先通过PLT跳转到GOT中对应函数的地址,然后再跳转到真正的函数地址执行。这种机制可以在运行时动态解析函数地址,实现函数的延迟绑定和共享。

PLT/GOT的优势在于可以减少.so文件的大小,提高程序的运行效率,并且支持动态链接,使得程序可以在运行时加载和卸载.so文件,实现模块化的开发和部署。

在云计算领域,PLT/GOT的应用场景包括但不限于:

  1. 动态链接库:通过使用PLT/GOT,可以将常用的函数和变量封装在.so文件中,供多个程序共享使用,减少代码冗余,提高开发效率和程序性能。
  2. 插件系统:PLT/GOT可以用于实现插件系统,允许用户在运行时加载和卸载插件,扩展程序的功能和灵活性。
  3. 虚拟化技术:在虚拟化环境中,PLT/GOT可以用于实现虚拟机和宿主机之间的函数调用和数据传递,提高虚拟机的性能和隔离性。

腾讯云提供了一系列与云计算相关的产品,包括云服务器、云数据库、云存储、人工智能等。具体推荐的产品和产品介绍链接地址可以参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java实现csv大文件拆分,每个文件都有标题行

一、背景 开发中,我们经常需要导入csv文件到数据库中,但是如果csv文件太大了,可能会报错,这时候可以对csv文件进行拆分,分批导入。..., splitSize);方法对csv文件进行拆分并返回拆分后的文件夹路径。...(4)这个方法主要思路将大文件流放到BufferedReader里面,然后获取总行数,根据参数splitSize计算需要拆分成几个小文件,需要几个文件,我们就创建几个,放到list集合里,一行一行遍历源文件...,存放临时文件的地方可能已存在同名的文件,需要删除。...意思就是我们拆分文件时,肯定需要把拆分的文件放到一个地方,可能这个地方不干净,有其他文件,所以我们放之前先删除一下这里的文件。方法如下:这个方法在上面拆分文件方法里用到了。在这里补充一下。

1.6K20

《程序员的自我修养》笔记

这种动态符号会存储在单独的got表和plt表里面 动态链接的可执行文件里 不仅仅只有可执行文件,还有单独的文件so 所以查看这种可执行文件的segement分布时,就可以看到segement所处的文件文件路径和文件...有动态链接的可执行文件他的程序文件头里面不仅有共享库的segement记录(连接的时候需要把so链接进来 标识哪些符号是动态链接符号这些地址会在运行时重定位,每个so的segement都会给分配虚拟地址区域和文件节点和文件路径...表里该符号在got.plt中的对应项,每个延迟绑定的符号在got.plt段中都有一个 相应的plt项存储,会存储dynamic段的地址(关于动态链接相关的参数和设置项,在这不考虑)和该符号所在的模块地址...简单总结 总结还是在家一层转换层处理延迟绑定:跳转到plt查找got是否存储着符号地址----不存储代表没有加载到内存因此加载 模块到内存并设置got地址信息---访问got地址信息也就是跳转到了符号的真正地址...每个外部函数在PLT都有一个相应的项,比如bar()函数在PLT中的项的地址我们称之为bar@plt

9010
  • 深入了解GOT,PLT和动态链接

    本文所用的依然是Linux x86 64位环境, 不过分析的ELF文件是32位的(-m32). 大局观 首先, 我们要知道, GOTPLT只是一种重定向的实现方式....-lsymbol main.c libsymbol.so -o main_pi 符号表 函数和变量作为符号被存在可执行文件中, 不同类型的符号又聚合在一起, 称为符号表....而每个进程都有自己的虚拟内存空间, 以32位程序为例, 就有2^32=4GB的寻址空间, 从0x00000000 到0xffffffff....可对于动态链接库而言就比较麻烦, 如果每个.so文件都要求加载到某个绝对地址, 那简直是个噩梦, 因为你无法保证不和别人的.so加载地址冲突. 所以就有了位置无关代码的概念....可执行文件可以是位置无关的, 也可以是位置相关的, 动态链接库 绝大多数都是位置无关的. GOT表可写不可执行, PLT可执行不可写, 他们相互作用来实现函数符号的延时绑定.

    1.4K10

    【图片+代码】:Linux 动态链接过程中的【重定位】底层原理

    并且,在一个动态库文件中,有两个特殊的段(.rel.dyn和.rel.plt)来告诉链接器:.got和.got.plt这两个表中,有哪些符号需要进行重定位,这个问题下面会深入讨论。...liba.so动态库文件的布局 为了更深刻的理解.got和.got.plt这两个表,有必要来拆解一下liba.so动态库文件的内部结构。...通过readelf -S liba.so指令来看一下这个ELF文件都有哪些section: 可以看到:一共有28个section,其中的21、22就是两个GOT表。...我们还是把上图中的输出信息,画出详细的内存模型图,如下所示: GOT表的内部结构 现在,我们已经知道了liba.so库的文件布局,也知道了它的虚拟地址,此时就可以来进一步的看一下.got和.got.plt...从刚才的图片中看出: .got 表的长度是 0x1c,说明有 7 个表项(每个表项占 4 个字节); .got.plt 表的长度是 0x18,说明有 6 个表项; 上文已经说过,这两个表是用来重定位所有的变量和函数等符号的

    2.2K11

    ELF文件及android hook原理

    每个定义的符号都有一个相应的值,叫做符号值(Symbol Value),对于变量和函数,符号值就是它们的地址。 符号表是一个Elf32_Sym(32位)的数组,每个Elf32_Sym对应一个符号。...符号值(st_value) 每个符号都有一个对应的值。...每个变量都对应一个4字节的地址,链接器在装载模块的时候会查找每个变量所在的地址,然后填充GOT中的各个项,以确保每个指针所指向的地址正确。...GOT 位于 .got.plt section 中,而 PLT 位于 .plt section中。这些都是数据段,不同进程拥有其副本。...“.rel.dyn”段对数据引用的修正,它所修正的位置位于”.got”以及数据段; “.rel.plt”段对函数引用修正,它所修正的位置位于”.got.plt”。

    3.8K81

    深度解密Android中基于pltgot的hook实现原理

    目录 概述 简单示例 ELF文件格式初探 装载、动态链接与重定位 PLTGOT 如何定位基址? 如何修改呢?...动态链接的文件中,有专门的重定位表分别叫做.rel.dyn和.rel.plt: arm-linux-androideabi-readelf -r libnative-write.so ?...PLT:程序链接表(Procedure Link Table),外部调用的跳板,在ELF文件中以独立的段存放,段名通常叫做".plt" GOT:全局偏移表(Global Offset Table),用于记录外部调用的入口地址...这里先根据魔数来确定是否为ELF文件格式,而且文件头部里实际已经指明了SHT和PHT的偏移信息了 6.4、根据(基址 + e_phoff)确定程序头表PHT(Program Header Table)的地址...A:并不是,每一个共享库都有它自己的PLT/GOT表,因此需要对每个共享库都要进行hook操作才行。 Q:我在共享库中通过dlopen、dlsym的方式调用系统导入函数,这中方式可以被hook住吗?

    3.5K20

    延迟绑定

    在开始详细介绍PLT之前,我们先从动态链接器的角度设想一下:假设 liba.so需要调用ibc.so中的bar(函数,那么当 liba. so中第一次调用bar()时,这时候就需要调用动态链接器中的某个函数来完成地址绑定工作...调用函数并不直接通过GOT跳转,而是通过一个叫做PLT项的结构来进行跳转。每个外部函数在PLT都有一个相应的项,比如bar()函数在PLT中的项的地址我们称之为bar@plt。...的基本原理,PLT的真正实现要比它的结构复杂一些,ELF将GOT拆分成两个表".got"和"".got.plt"。...实际上的PLT结构如下: PLT0: push *(GOT + 4) jump *(GOT + 8) .... bar@plt: jmp *(bar@GOT) push n jump PLT0 PLT在...ELF文件中以独立代码的段存放,段名通常称为 ".plt",因为它本身就是一些地址无关的代码,所以可以跟代码段一起合并成同一个可读可执行的""Segment"被装载到内存中

    1.1K20

    CC++|链接|动态链接库

    我们经常在游戏目录下看见dll文件,这是windows下的动态链接库。在linux下我们可以使用-shared -fpic生成so文件。...内存布局 GOT(Global offset table) - 动态函数入口,elf中位于.got段,不可执行数据 PLT(Procedure linkage table) - 桩函数,elf中位于.got.plt...PLT由调用GOT代码+桩代码组成。桩代码用于动态修改GOT表。 GOT初始指向桩代码,后来指向动态函数。...PLT索引 = 函数索引x+1 GOT索引 = 函数索引x+3 初次调用,惰性加载 调用PLT[x+1] 跳转*GOT[x+3](桩代码地址) 传递动态链接函数索引x 跳转PLT[0] 传递动态链接表地址...GOT[1] 跳转*GOT[2](动态链接器函数地址) 修改GOT[x+3]为动态函数地址 后续调用,直接跳转 调用PLT[x+1] 跳转*GOT[x+3](动态函数地址) 应用 #include

    59320

    Android Native Hook

    你可以发现,GOT/PLT Hook 主要是用于替换某个 SO 的外部调用,通过将外部函数调用跳转成我们的目标函数。...你需要先对 SO文件的 ELF 文件格式和动态链接过程有所了解。...网上介绍 ELF 格式的文章非常多,你可以参考《ELF 文件格式解析》。顾名思义,对于 GOT/PLT Hook 来说,我们主要关心“.plt”和“.got”这两个节区: .plt。...链接过程 接下来我们再来看看动态链接的过程,当需要使用一个 Native 库(.so 文件)的时候,我们需要调用dlopen(“libname.so”)来加载这个库。...在我们调用了dlopen(“libname.so”)之后,系统首先会检查缓存中已加载的 ELF 文件列表。如果未加载则执行加载过程,如果已加载则计数加一,忽略该调用。

    1.2K20

    重学计算机组成原理(九)- 动态链接

    这就好比,假设每个都有骑自行车的需要,那我们给每个人都生产一辆自行车带在身边,固然大家都有自行车用了,但是马路上肯定会特别拥挤。...就好比,现在马路上的共享单车,我们并不需要给每个人都造一辆自行车,只要马路上有这些单车,谁需要的时候,直接通过手机扫码,都可以解锁骑行。...在Windows下,这些共享库文件就是.dll文件,也就是Dynamic-Link Libary(DLL,动态链接库) 用了“动态链接”的意思 在Linux下,这些共享库文件就是.so文件,也就是Shared...3 动态链接的解决方案 PLTGOT 要实现动态链接共享库,也并不困难,和前面的静态链接里的符号表和重定向表类似 拿出一小段代码来看一看。...不同的进程,调用同样的 lib.so,各自GOT里面指向最终加载的动态链接库里面的虚拟内存地址是不同的。

    47600

    hook的几种方式及原理学习

    重定位与动态链接 当多个 .o 文件链接或 运行时需要动态库的时候,都有重定位的概念,在链接的时候,多个.o之间 相互依赖的变量和函数 要找到实际的地址, 同样运行时依赖动态库中的函数,一般是记录在全局偏移表中...rel.dyn”实际上是对数据引用的修正,它所修正的位置相当于”.got “以及数据段;而”.rel.plt”则是对函数引用的修正,所修正的位置位于”.got.plt”。...及 PLT 表 在Linux下,GOT被拆分成”.got”和”.got.plt”2个表。...,进程运行的时候,如果依赖动态库,那么运行之前,需要把 程序依赖的动态库里面的每个变量和函数都 初始化 GOT表,这样的后果就是 如果依赖比较多,加载缓慢; 后来通过 PLT 设计了 延迟加载的功能,...比如rand , 我们直接用 rel表的地址 GOT表项替换 全局符号表(GOT表)hook实际是通过解析SO文件,将待hook函数在got表的地址替换为自己函数的入口地址,这样目标进程每次调用待hook

    1.9K30

    重学计算机组成原理(九)- 动态链接

    这就好比,假设每个都有骑自行车的需要,那我们给每个人都生产一辆自行车带在身边,固然大家都有自行车用了,但是马路上肯定会特别拥挤。...在Windows下,这些共享库文件就是.dll文件,也就是Dynamic-Link Libary(DLL,动态链接库) 用了“动态链接”的意思 在Linux下,这些共享库文件就是.so文件,也就是Shared...3 动态链接的解决方案 PLTGOT 要实现动态链接共享库,也并不困难,和前面的静态链接里的符号表和重定向表类似 拿出一小段代码来看一看。...gcc编译 show_me_poor 动态链接了 lib.so 的可执行文件 在这些操作都完成了之后,我们把 show_me_poor 这个文件通过objdump出来看一下。...不同的进程,调用同样的 lib.so,各自GOT里面指向最终加载的动态链接库里面的虚拟内存地址是不同的。

    21820

    GOT段在linux系统中实现代码动态加载的作用和其他段的说明

    动态加载,也就是在调用系统函数时再去确认所调用的函数地址的技术需要使用两个段,一个是.plt段,一个是.got.plt段。...上图显示的代码也叫“函数桩”,每个系统函数都对应一段这样的代码。为何要用“桩”来描述这些代码呢,因为这些指令都做了相同的工作,首先他们都将一个数值压入堆栈,这个数值对应该段代码的序号。...为何不直接将被调用函数的地址直接写入到ELF文件中,而是要绕一个大弯,先要把函数地址写入.got.plt然后再写入到.plt段里面的“函数桩”呢,主要原因在于安全考虑。...got.plt段属于数据段,因此里面的数据可以修改,绕这个弯的目的就是防止代码被他人直接修改。除了.got.plt段外,还需要理解的是.got段,后者的作用主要在于访问共享代码库到处的变量。...可以看到第一行对应的libc.so.6就表明该ELF文件如果要加载运行就必须确保共享库libc.so.6要被加载到内存里 需要关注的还有.init_array和.fini_array段,前者包含了一系列代码在运行前需要执行的一系列初始化函数

    2.3K20

    【胖虎的逆向之路】——GOTPLT Hook详解&针对自定义so库的Hook实操

    &GOT/PLT&In Line Hook的相关知识和实际操作,Android Native Hook 的实现方式有很多种,我们接下来要讲的是 GOT/PLT Hook (篇幅略略略长,阅读时长约 20...以及数据段 .rel.plt:是对函数引用的修正,它所修正的位置位于.got .plt:程序链接表(Procedure Link Table),外部调用的跳板 .text:为代码段,也是反汇编处理的部分...-r xxx.so ---- 三、PLTGOT Hook(Native,你们的Hook回来了~) 呼,喝杯水~ 在前面的装载->动态链接->重定位完成之后,我们目标动态库的基址已经确定了,在当我们调用某个函数...:程序链接表(Procedure Link Table),外部调用的跳板,在ELF文件中以独立的段存放,段名通常叫做”.pltGOT:全局偏移表(Global Offset Table),用于记录外部调用的入口地址...PLTGOT的跳转,到达我们最终的真实的导入函数的地址~ 2、更快速的找到目标函数的偏移 前面也提到过动态链接重定位表中的.rel.plt是对函数引用的修正,它所修正的位置位于.got

    99741

    ret2libc过地址随机化

    这里我们需要了解几个知识点: (1)system 函数属于 libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的(即使打开ASLR也是这样的) (2)在linux的gcc使用C语言源文件的二进制文件时...例如通过gcc hello.c -o hello即可生成一个文件名为hello的可执行文件,该程序会输出Hello World (3)PLT表中的数据不是函数的真实地址,即带有@plt标志的函数,起个过渡作用...(4)GOT表项中的数据才是函数最终的地址,而PLT表中的数据又是GOT表项的地址,我们就可以通过PLT表跳转到GOT表来得到函数真正的地址 (5)地址随机化并没有对PLT表、GOT表产生作用 了解到上面的知识点后...可以看见在我们执行gets函数时,我们会先去到plt表,然后又会jmp到GOT里面的真实地址:0x8049030 接下来我们计算计算system、/bin/sh与gets函数的相对偏移 ?...,分析ELF结构addr_write=e.plt["write"]addr_gets=e.got["gets"]//gets函数最后的真实地址在got表中addr_vul=e.symbols["vul"

    87720

    linux的so注入与热更新原理

    int add(),最后编译成了main.out与add.so两个elf文件。...实际上某些比较大的如libstdc++.so并不是,对于这种情况,就需要指定具体so文件路径,解析好函数在文件中的偏移,再加上so内存地址就是函数地址了。...如果找的是foo2,foo2是在另一个elf中定义的,例如之前提到的,调用add.so函数的add函数。那么就需要左边的rela.plt(重定向信息)以及got.plt(位置偏移信息)。...第二行和第三行传参调用libc完成了绑定puts的过程,并且更新got。 后续再调用第一行,就直接跳转到了目标函数了。 为什么plt里不直接存放地址,要搞个got?...理论上是可以got里的每个地址拆分放到plt中,可能是出于逻辑与数据分离考虑,并且分开后内存页的读写权限更好管理,毕竟一个是可执行,一个是可写。

    11.3K50
    领券