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

如何在运行时读取共享库数据段开头的绝对加载地址?

在运行时读取共享库数据段开头的绝对加载地址,可以通过以下步骤实现:

  1. 获取当前进程的PID(进程标识符)。
  2. 通过PID,使用系统调用(如/proc文件系统)获取当前进程的内存映射信息。
  3. 遍历内存映射信息,找到目标共享库的加载地址范围。
  4. 在加载地址范围内,定位到共享库数据段的开头地址。

具体步骤如下:

  1. 获取当前进程的PID。在Linux系统中,可以使用getpid()函数获取当前进程的PID。
  2. 使用系统调用(如/proc文件系统)获取当前进程的内存映射信息。在Linux系统中,可以读取/proc/[PID]/maps文件获取当前进程的内存映射信息。该文件包含了当前进程的内存映射区域及其属性。
  3. 解析内存映射信息,找到目标共享库的加载地址范围。共享库通常以.so为后缀,可以通过名称或路径来确定目标共享库。在内存映射信息中,每一行描述了一个内存映射区域,包括起始地址、结束地址、权限等信息。通过解析这些信息,可以确定目标共享库的加载地址范围。
  4. 在加载地址范围内,定位到共享库数据段的开头地址。共享库的数据段通常包含全局变量、静态变量等数据。可以通过计算偏移量或使用符号表等方式,定位到数据段的开头地址。

需要注意的是,以上步骤涉及到系统调用和底层操作,需要具备相应的操作系统和编程知识。在实际开发中,可以使用相关的系统库或工具来简化这些操作。

腾讯云提供了一系列云计算相关的产品和服务,包括云服务器、云数据库、云存储等。您可以根据具体需求选择适合的产品。更多关于腾讯云产品的信息和介绍,可以访问腾讯云官方网站:https://cloud.tencent.com/

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

相关·内容

《程序员自我修养》笔记

有动态链接可执行文件他程序文件头里面不仅有共享segement记录(连接时候需要把so链接进来 标识哪些符号是动态链接符号这些地址在运行时重定位,每个sosegement都会给分配虚拟地址区域和文件节点和文件路径...运行时候动态链接器会首先加载动态链接共享到内存里,此时虚拟地址和物理地址都确定了,接着就可以修改数据里面的got了,got中匹配符号 记录符号真正存储虚拟地址数据重定位运行时不同进城有副本切可以随意修改...) 很类似stub占桩 ,放一个变量在内存里,运行时候给这个变量设置动态加载地址,程序用stub就是变相在用地址stub存根很适合这个例子,数据又是可以随意修改 got简单总结,如何实现代码共享...程序访问stub时候,编译时候会设置为访问got中符号地址,这块地址存储数据只有运行时候才会赋值,运行时加载号之后,地址上存了值,程序访问got中指定地址符号存储地址值就是动态加载加载到内存虚拟地址...另外一个减慢运行速度原因是动态链接链接工作在运行时完成,即程序开始执行时,动态链接器都要进行一次链接工作,正如我们上面提到,动态链接器会寻找并装载所需要共享对象,然后进行符号查找地址重定位等工作

8810

CSAPP---第七章-链接

,这是对内存极大浪费 共享是一个目标模块,在运行或加载时,可以加载到任意内存地址,并和一个在内存中程序链接起来。...更进一步地说,在运行时无需停止服务器,就可以更新已存在函数,以及添加新函数。 Linux 系统为动态链接器提供了一个简单接口,允许应用程序在运行时加载和链接共享。...而由于是共享,每个动态链接代码内容是完全一样(代码可以通过内存映射完成多进程间共享),这样只能在数据做手脚了,因为数据不是只读,无法共享。...共享目标文件(共享)是在运行时由动态链接器链接和加载,或者隐含地在调用程序被加载和开始执行时,或者根据需要在程序调用 dlopen 函数时。...被编译为位置无关代码共享可以加载到任何地方,也可以在运行时被多个进程共享。为了加载、链接和访问共享函数和数据,应用程序也可以在运行时使用动态链接器。

85610
  • ELF文件及android hook原理

    链接器在处理目标文件时,需要对目标文件中某些部位进行重定位,即代码数据中中那些绝对地址引用位置。对于每个需要重定位代码数据,都会有一个相应重定位表。...我们还需要有一种更好方法解决共享对象指令中对绝对地址重定位问题。...相当于链接器给动态加载器布置了填空题作业。 一个符号调用在第一次时会解析出绝对地址更新到 GOT 中,第二次调用时就直接找到 GOT 表项所存储函数地址直接调用了。...动态加载器解析结束,可以看到got表项正确指向了libc动态中printf地址 ?...用readelf查看elf文件动态符号表及它哈希表。 ? 动态链接重定位表 在动态链接中,导入符号地址在运行时才确定,所以需要在运行时将这些导入符号引用修正,即需要重定位。

    3.8K81

    C程序内存布局

    C程序内存布局包含五个,分别是STACK(栈),HEAP(堆),BSS(以符号开头块),DS(数据)和TEXT(文本段)。 每个都有自己读取,写入和可执行权限。...#include int main(void) { int data; // 局部变量,存储在栈上 return 0; } 堆 用于在运行时分配内存。...由内存管理函数(如malloc、calloc、free等)管理堆区域,这些函数可以在内部使用brk和sbrk系统调用来调整其大小。 堆区域由进程中所有共享和动态加载模块共享。...此段大小由程序源代码中值大小决定,在运行时不会更改。 它具有读写权限,因此可以在运行时更改此段变量值。 该段可进一步分为初始化只读区和初始化读写区。...该段是一个只读,用于防止程序被意外修改。 该段是可共享,因此对于文本编辑器等频繁执行程序,内存中只需要一个副本。

    3.2K61

    Linux:基础IO(三.软硬链接、动态和静态、动精态制作和加载

    这是共享所需要,因为共享可以在程序行时加载到任何内存地址。使用-fPIC选项(在GCC中)告诉编译器生成这样代码(产生与位置无关码)。...静态所有代码和数据都会被复制到可执行文件中,因此程序在运行时可以独立执行,不需要依赖外部文件。...动态共享本质就是:所有系统进程中公共代码和数据,只需要存在一份! 3.1系统角度 在程序加载时,代码通常被加载到进程虚拟地址空间中代码中。...这样,即使程序还没有被加载到内存中,各个符号仍然具有自己地址。 此外,可执行程序在磁盘上已经被划分为不同区域,这些区域通常包括代码数据、符号表等。...后来由操作系统读取,成为虚拟地址 编址方式有两个:绝对编址和相对编址/逻辑编址 绝对编址(平坦模式):地址都是连续 相对编址/逻辑编址:会为每个不同区域开始处(start)分配一个地址后,其后地址为相对于

    16210

    Java虚拟机工作原理

    主要介绍下图中加载器和运行时数据区两个部分。 ?...类加载加载指将类字节码文件(.class)中二进制数据读入内存,将其放在运行时数据方法区内,然后在堆上创建java.lang.Class对象,封装类在方法区内数据结构。...,从特定场所(数据、网络中)取得java class。...如下我们将介绍运行时数据区,主要分为方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。其中方法区和Java堆一样,是各个线程共享内存区域,而虚拟机栈、本地方法栈、程序计数器是线程私有的内存区。...此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况区域。 写了这么多,感觉还是少一个例子。通过最简单代码解释一下,程序在运行时数据区个部分变化情况。

    50320

    Linux漏洞分析入门笔记-栈溢出

    与静态不同,共享代码在多个进程之间共享,而其数据对于每个进程是唯一。这有助于减少内存和磁盘空间。...那么动态链接如何在运行时重新定位共享符号而不修改其代码?它使用PIC完成! 什么是PIC?...位置无关代码(PIC)是为了解决这个问题而开发 - 它确保共享代码在多个进程之间共享,尽管在加载时执行重定位。...PIC通过一级间接寻址实现这一点-共享代码不包含绝对虚拟地址来代替全局符号和函数引用,而是指向数据特定表。该表是全局符号和函数绝对虚拟地址占位符。动态链接器作为重定位一部分来填充此表。...当代码指令引用全局变量时,而不是全局变量绝对虚拟地址,指令指向GOT中条目。当加载共享时,GOT条目由动态链接器重新定位。因此,PIC使用该表来重新定位具有单个间接级别的全局符号。

    2K40

    《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接

    比如,许多软件产品在运行时使用共享来升级压缩包装( shrink- wrapped)二进制程序。...运行时堆在数据之后,通过调用malloc往上增长。堆后面的区域是为共享模块保留。用户栈总是从最大合法用户地址( )开始,向较小内存地址增长。...同时,在分配栈、共享和堆行时地址时候,链接器还会使用地址空间布局随机化。虽然每次程序运行时这些区域地址都会改变,它们相对位置是不变。   ...共享目标文件(共享)是在运行时由动态链接器链接和加载,或者隐含地在调用程序被加载和开始执行时,或者根据需要在程序调用dlopen函数时。   ...被编译为位置无关代码共享可以加载到任何地方,也可以在运行时被多个进程共享。为了加载链接和访问共享函数和数据,应用程序也可以在运行时使用动态链接器。

    2.6K31

    【Linux】静态和动态

    所以这个可执行程序中就会形成许多,它就是采用偏移量不同这种方式定位每个。 在计算机里面,对程序进行编址时候,会有两种编址方式,一种是绝对编址,另一种是相对编址。...但是动态也要被加载到内存,所以动态加载至内存后,也要经过页表映射,映射到地址空间中共享区!所以进程可以通过地址空间找到代码和数据,并且可以在共享区找到动态代码。...所以未来动态地址空间中共享区中随意加载都可以了,因为我们方法编址方式都是相对编址方式,是相对于该偏移量是多少,所以无论该地址共享区中如何变化,偏移量在该中是不变,所以我们就能很快地找到对应方法...然后读取指令时,读到了 call 0x2222,如果后续代码和数据不在内存里,就重新加载,重新构建映射,因为起始地址都已经有了,剩下虚拟地址都是连续!因为正文代码区中代码都是在一起!...当读取到 call 0x2222 方法,CUP 就读取对应指令,call 方法就要做函数跳转,因为 0x2222 也是虚拟地址,它也加载到内存中了,所以可以根据页表映射关系找到对应 A函数,然后就可以找到代码和数据

    54510

    kong优化参考

    在Kong配置文件中,约定了以下几条规则: 配置文件中以#开头行均为注释行,程序不会读取这些内容。 在官方提供默认配置文件中,以#开头有值配置项目均为默认配置。...:配数据类型,地址、用户名密码等等信息 数据缓存配置:配置数据缓存规则,Kong会缓存诸如API信息、用户、凭证等信息,以减少访问数据次数提高性能 DNS解析器配置:默认情况会使用系统设置,如hosts...如果设置为0表示永不过期 Kong从数据读取数据并且缓存,在ttl过期后会删除这个缓存然后再一次读取数据并缓存 db_resurrect_ttl 30 缓存刷新时间,单位秒。...在Kong配置文件中,约定了以下几条规则: 配置文件中以#开头行均为注释行,程序不会读取这些内容。 在官方提供默认配置文件中,以#开头有值配置项目均为默认配置。...如果设置为0表示永不过期 Kong从数据读取数据并且缓存,在ttl过期后会删除这个缓存然后再一次读取数据并缓存 db_resurrect_ttl 30 缓存刷新时间,单位秒。

    1.5K10

    学习计算机基础知识汇总

    ,所以还是需要从减小内存占用量出发思考问题: 使用dll动态链接 对于多个程序来说 可能用程序有很多一样的如果每个进程内存空间里都加载一份 就会导致内存不必要浪费,相反用动态链接的话 共享只会加载一次...在运行时需要时候会找到这个位置目标文件并加载到内存中;如果其他程序也需要 就可以直接用这个加载而不用像静态链接一样把本地 目标文件再次加载到内存里面。...:headertable再配置信息&不同记录偏移 目标文件里面的 变量和函数在运行时内存地址是不固定,那么如何保证调用变量和调用函数是正确内存地址呢?...起始地址是运行时候动态分配 ,目标文件会在开头添加 再配置信息,再配置信息里面会表述 如何将虚拟地址转换为真实内存地址(再配置信息里面会存储各个不同和对应起始虚拟地址和真实地址映射关系)...;再配置信息之后就是 不同类型数据了(也就是数据和函数) 总结就是分类存储,只动态分配每个类型起始地址就好,之后同类型数据都是线性排列在开头之后所以根据偏移量就可以找到具体内存地址

    12810

    深入浅出动静态

    动态又叫做 共享,在Linux下动态有自己后缀名:.so,所以 libc.so.6 其实就是一个动态。并且 动态是在程序运行时加载进来 !...动态缺点:动态在运行时需要额外加载和链接过程,会导致性能开销增加。因为是在运行时加载,所以调试起来也很麻烦。动态与程序是分离,因此具有版本依赖性。   ...静态一般需要下载下来,使用如下指令下载: sudo yum install glibc-static 动态链接和静态链接 在动态链接中:程序在运行时通过动态链接器将所需加载到内存中,而不是将代码和数据复制到可执行文件中...pc指针用来读取程序,而程序加载之前都是虚拟地址,也就是说,pc指针负责读取虚拟地址,而cr3指针负责将虚拟地址转化为物理地址。...我们来分析动态加载过程,首先,动态在磁盘当中有自己起始地址,可执行程序在程序内拥有动态起始地址加上需要调用方法位置偏移量。

    11710

    程序如何运行:编译、链接、装入

    一、地址概念和程序如何运行 在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程第一件事,便是将程序和数据装入内存。...3.运行时动态链接(Run-time Dynamic Linking) 在许多情况下,应用程序在运行时,每次要运行模块可能是不相同。...绝对装入程序按照装入模块中地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中逻辑地址与实际内存地址完全相同,故不须对程序和数据地址进行修改。...由于程序 因此,通常是宁可在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址如何把虚拟内存地址空间变换到内存唯一一维物理线性空间?...构造动态链接 DLL是包含函数和数据模块,它调用模块可为EXE或DLL,它由调用模块在运行时加载加载时,它被映射到调用进程地址空间。

    1.7K10

    深入浅出链接 | 静态与动态

    也正因为如此,使用静态时生成可执行文件是可以独立运行,因为他不再需要外部内容,而动态编译生成可执行文件就无法单独运行,因为他在运行时,才会去链接所引用外部地址。 1....但是,正因为静态会直接加载到内存代码,可执行文件内部都拷贝了所有目标文件和静态指令和数据,编译生成可执行文件会比较大。...动态在运行时加载到内存共享,这样,如果很多程序都要用到静态时候,就会节省大量内存,因为它不像静态那样加载到代码,而是是在运行时载入内存共享,当多个程序要用到同一个动态时,所有程序可以共享这个共享指令和数据...动态链接实现是这样,在编译时首先由静态链接器将所有的目标文件链接为一个可执行文件,等到程序运行时会将要用到动态加载到内存共享,由动态链接器完成可执行文件和动态文件链接工作,可以理解为按需载入内存...动态制作 ① 编译生成与位置无关 .o 文件 动态共享在运时候才加载,它加载到内存共享,用完后就释放,所以要编译为与位置无关

    25010

    【Linux】详解动态链接和加载&&对可执行程序底层理解

    二、理解动态加载 我们动态默认就是一个磁盘级别的文件。当我们程序开始运行时,当程序运行到需要用到实现方法时,代码和数据就会被加载到物理内存当中。...当我们静态被我们可执行程序加载时,静态代码就要被写到我们可执行程序text部分,静态代码在text部分绝对编址是确定,当然静态数据编址也是确定。...3.3、理解动态动态链接和加载 在进程在被创建时候是要先创建PCB,初始化它对应进程地址空间,然后再将磁盘中数据加载到内存。为了初始化进程地址空间,操作系统读取可执行程序表头。...在磁盘中存放着可执行程序表头中就包含了关于程序执行所必需一系列元数据和结构信息,操作系统通过读取表头中信息初始化对应地址空间中正文代码,已初始化数据和未初始化数据,所以我们也就能理解了为什么不同可执行程序加载完进程地址空间中有数据地址范围不一样了...当这个进程要被CPU调度执行时,CPUpc指针就保存了main函数入口地址(pc指针内保存是虚拟地址),CPU内部可以帮我们读取页表内容将虚拟地址转换为物理地址,CPU去到相应物理地址取到指令放到

    1.4K10

    编译器、链接器和解释器

    链接器会遍历目标文件中重定位信息(.relo.text、.relo.data),将这些相对地址替换为实际绝对地址。这样,可执行文件就可以正确地在内存中加载和执行。 3....这些代码和数据存储在系统共享中(也称为动态链接共享对象,如 .so 或 .dll 文件)。多个程序可以共享同一个实例,减少了存储空间和系统资源浪费。...动态链接可能发生在两个时机: 加载动态链接:操作系统会在执行可执行文件之前,将所需共享加载到内存中。这时,链接器会解析可执行文件中引用,将这些引用关联到所加载共享实际函数和变量。...运行时动态链接:共享已经在加载加载到了内存中,但链接最终步骤是在程序运行时进行。这时,操作系统会确保程序可以正确地访问所需共享函数和变量。...程序在运行期间,可以根据需要调用共享函数,操作系统会负责将这些调用关联到实际代码。 4.

    30720

    一文领略链接与装载

    多个进程可以共享内存中只读数据,比如代码和图片资源等(参考共享原理),节约内存占用。...然而,单纯将程序所占虚拟地址空间直接映射到物理内存无法解决内存使用效率低问题,物理内存仍然会快速消耗殆尽。 页映射机制 程序局部性原理:一个程序在运行时,某时间内只使用到了一部分程序数据。...通过共享对象来做复杂系统兼容,增强可执行文件兼容性。 程序在运行时动态加载程序模块,便于制作插件。 动态链接缺点: 运行时重定位拖慢了程序启动速度(通过 延迟绑定 优化)。...原因很简单,数据部分多是可读写,进程间只能使用独立副本,而指令是只读,多进程共享也没有影响。 共享对象虚拟地址是装载器动态分配,那么共享对象数据里面绝对地址引用是需要修复。...和目标文件一样,共享对象数据中若有绝对地址引用,会生成对应重定位表,当动态链接器把这个共享对象装载后,会根据重定位表将数据地址引用修正。这个方法叫做 装载时重定位 。

    93730

    深度解密Android中基于pltgothook实现原理

    .rel.dyn:实际上是对数据引用修正,它所修正位置位于.got以及数据。 .rel.plt:是对函数引用修正,它所修正位置位于.got。....got:全局偏移表(Global Offset Table),用于记录外部调用入口地址。 .data:数据,保存那些已经初始化了全局静态变量和局部静态变量。...在编译时这些导入符号地址未知,在运行时才确定,所以需要在运行时将这些导入符号引用修正,即需要重定位。...上图已经列举出了我们应用加载一些so,左边标记红色地址就是各个so基址 #在进程ID为32396进程中加载几个中 libhook-simple.so基址为:0xD40D8000...,当然不行,因此需要一个通用逻辑来定位具体偏移和基址才行,接下来我们重点来看下偏移和基址如何通过通用代码来动态确定 6.1 解析基址和偏移 我们接下来要做重要工作是在运行期间,动态定位目标共享基址和偏移

    3.5K20

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

    因此必须有机制让程序在运行过程中,在调用系统API时候有办法去确定所调用系统函数对应入口地址,这就是代码运行时对应动态加载过程。...这里需要注意是,第二次执行4003f0这个位置对应指令时,从.got.plt取出数值就不再是动态链接入口地址,而是puts函数对应入口地址,于是动态链接工作完成,代码能够在运行时正确调用到它想要执行系统函数...除了.got.plt外,还需要理解是.got,后者作用主要在于访问共享代码到处变量。两者区别在于.got.plt包含了代码,而.got会直接包含共享到处变量地址而不是包含代码。...另外还需要关注是.dynamic,使用命令 readelf —dynamic a.out可以查看: ? 在TYPE一栏为NEED表明,对应共享需要在代码运行时加载到系统内存。...可以看到第一行对应libc.so.6就表明该ELF文件如果要加载运行就必须确保共享libc.so.6要被加载到内存里 需要关注还有.init_array和.fini_array,前者包含了一系列代码在运行前需要执行一系列初始化函数

    2.3K20

    从程序员角度看ELF

    通过dynamic,链接器在它自己数据中找到自己重定位项表和   重定位指针,然后解析例程需要加载其它东西代码引用(Linux ld.so将所有的基础例   程都命名为由字串_dt...但实际中链接器   并不是在运行时创建一个合并后符号表,而是将个个文件中符号表组成一个符号表链。   ...一旦找到包含该文件,动态链接器会打开该文件,读取ELF头部寻找程序头部,它   指向包括dynamic在内众多。...共享初始化   现在加载器再次查看每个并处理重定位项,填充GOT,并进行库数据所   需任何重定位。   ...然后它将SONAM   E和全路径名称写入缓冲文件,这样在运行时动态链接器可以很快找到每一个的当前版   本。

    97640
    领券