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

动态链接的相关结构

这时候,可执行文件里对于很多外部符号的引用还处于无效地址的状态,即还没有跟相应的共享对象中的实际位置链接起来。...,比如依赖于哪些共享对象、动态链接符号表的位置、动态链接重定位表的位置、共享对象初始化代码的地址等。...在动态链接下,无论是可执行文件或共享对象,一旦它依赖于其他共享对象,也就是说有导入的符号时,那么它的代码或数据中就会有对于导入符号的引用。...但是在动态链接中,导入符号的地址在运行时才确定,所以需要在运行时将这些导入符号的引用修正,即需要重定位; 我们在前面地址无关章节中也提到过,动态链接的可执行文件使用的是PIC方法,但这不能改变它需要重定位的本质...是的,PIC的共享对象也是需要重定位的; 对于使用PIC技术的可执行文件或共享对象来说,虽然它们的代码段不需要重定位(因为地址无关),但是数据段还包含了绝对地址的引用,因为代码段中绝对地址相关的部分被分离了出来

1.7K20

ELF文件及android hook原理

与普通程序不同的是,动态链接模块的装载地址是从地址0x00000000开始的,这个地址是无效的,共享对象的最终装载地址在编译时时不确定的,而是在装载时,装载器根据当前地址空间的空前情况,动态分配一块足够大小的虚拟地址空间给相应的共享对象...我们还需要有一种更好的方法解决共享对象指令中对绝对地址的重定位问题。...程序开始执行时,动态链接器都要进行一次链接工作,会寻找并装载所需的共享对象,然后进行符号查找地址重定位等工作,如此一来,程序的运行速度必定会减慢。....dynamic段 这个段里保存了动态链接器所需要的基本信息,比如依赖哪些共享对象、动态链接符号表的位置、动态链接重定位表的位置、共享对象初始化代码的地址等。...用readelf查看elf文件的动态符号表及它的哈希表。 ? 动态链接重定位表 在动态链接中,导入符号的地址在运行时才确定,所以需要在运行时将这些导入符号的引用修正,即需要重定位。

3.9K81
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ELF文件从形成到加载轮廓

    动态链接的 Segment 可能包含 .dynamic 和 .got.plt Section,用于运行时解析共享库符号。....got.plt:全局偏移表和过程链接表,用于动态链接,保存共享库函数的间接引用地址,运行时由动态链接器修改。...Type 字段区分文件类型:REL(可重定位)、EXEC(可执行)、DYN(共享对象)。...每个段的信息包括:文件偏移量(从文件开头计算)、虚拟内存地址、大小、权限(可读、可写、可执行)。 偏移量关系: 它的起始位置由 e_phoff 决定。...偏移量关系: 每个节的起始偏移量记录在节头表中(后面会讲到)。 这些偏移量是从文件开头计算的字节数。例如,.text 节可能从偏移量 1024 开始,.data 节从 2048 开始。

    7710

    动态链接的步骤与实现

    然后链接器开始从集合里取个所需要的共享对象的名字,找到相应的文件后打开该文件,读取相应的ELF文件头和“ .dynamic”段,然后将它相应的代码段和数据段映射到进程空间中。...如果这个ELF共享对象还依赖于其他共享对象,那么将所依赖的共享对象的名字放到装载集合中。...由于存在这种重名符号被直接忽略的问题,当程序使用大量共享对象时应该非常小心符号的重名问题,如果两个符号重名又执行不同的功能,那么程序运行时可能会将所有该符号名的引用解析到第-个被加入全局符号表的使用该符号名的符号...在前面介绍动态链接的重定位表时,我们已经碰到了几种重定位类型,每种重定位入口地址的计算方法我们在这里就不再重复介绍了。...在这种情况下,动态链接器就会解析运行时的参数,并且进行相应的处理_dl_main本身非常的长,主要的工作就是前面提到的对程序所依赖的共享对象进行装载、符号解析和重定位,我们在这里就不再详细展开了,因为它的实现细节又是一个非常大的话题

    1.4K20

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

    动态链接下,无论是可执行文件或共享对象,一旦它依赖于其他共享对象,也就是说有导入的符号时(比如fwrite函数),那么它的代码或数据中就会有对于导入符号的引用。...在编译时这些导入符号的地址未知,在运行时才确定,所以需要在运行时将这些导入符号的引用修正,即需要重定位。...5.1 从.dynsym开始 .dynsym:上面也说到了,这个节里只保存了与动态链接相关的符号导入导出关系。...可以看到我们从libc库中的导入函数fwrite,这个偏移和我们刚才计算的偏移是一致的都是:0x2FE0。 5.3 如何定位基址?...6.2、保存原始的调用地址 当我们自己的共享库完成对目标共享库的hook操作之后,要保证功能正常运行,需要先保存原始的函数调用地址。 6.3、解析ELF文件头部 ?

    3.6K20

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

    ”和“0xFFFFFFFC”代替着(因为是外部库的符号,所以在编译程序的时候会先用固定的地址代替),把真正的地址计算工作留给了链接器。...运行的时候动态链接器会首先加载动态链接的共享库到内存里,此时虚拟地址和物理地址都确定了,接着就可以修改数据段里面的got了,got中匹配符号 记录符号真正存储的虚拟地址(数据段的重定位运行时不同进城有副本切可以随意修改...另外一个减慢运行速度的原因是动态链接的链接工作在运行时完成,即程序开始执行时,动态链接器都要进行一次链接工作,正如我们上面提到的,动态链接器会寻找并装载所需要的共享对象,然后进行符号查找地址重定位等工作...并 调用动态链接解析器函数 去加载模块到内存并把加载后的符号地址 存入到got中,这样下一次就会从got中找到地址然后跳转运行。...但这不能改变它需要重定位的本质 对于使用PIC技术的可执行文件或共享对象来说,虽然它们的代码段不需要重定位(因为地址无关,动态链接器加载完模块后会修正got里面记录的地址) ,但是数据段每个进程都会加载

    9910

    CSAPP---第七章-链接

    count是全局符号,根据type可知符号表示是一个数据对象类型,它所在节头部表索引为3,可以定位到.data节中,再根据value表示在.data节中的偏移量得到对象地址,size表示对象大小。...ELF 头描述文件的总体格式。它还包括程序的入口点(entry point),也就是当程序运行时要执行的第一条指令的地址。...除了一些头部信息,在加载过程中没有任何从磁盘到内存的数据复制。直到 CPU 引用一个被映射的虚拟页时才会进行复制,此时,操作系统利用它的页面调度机制自动将页面从磁盘传送到内存。...被编译为位置无关代码的共享库可以加载到任何地方,也可以在运行时被多个进程共享。为了加载、链接和访问共享库的函数和数据,应用程序也可以在运行时使用动态链接器。...---- 参考 《深入理解计算机操作系统》第七章 【CSAPP-深入理解计算机系统】7-1.

    92410

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

    ELF 作为一种可移植的格式,被 TIS 应用于基于 Intel 架构 32 位计算机的各种操作系统上。...ELF 文件格式规范由 TIS(Tool Interface Standards – 工具接口标准)委员会制定, TIS 委员会是一个微型计算机工业的联合组织,它致力于为 32 位操作系统下的开发工具提供标准化的软件接口...使用~ 当so动态库被装载的时候,动态链接器linker会将动态库装载到进程的地址空间,并且将程序中所有没确定的符号绑定到相应的动态链接库中,并进行重定位的工作~ 3、重定位 共享库进行重定位的主要原因是在于导入符号原因...,在动态链接下,可执行文件如果依赖于其他共享对象,也就是说有导入的符号时(比如easy_curl_getopt函数),那么它的代码或数据中就会有对于导入符号的引用,在编译时这些导入符号的地址未知,在运行时才确定...,所以需要在运行时将这些导入符号的引用修正,即需要重定位 动态链接的文件中,有专门的重定位表分别叫做.rel.dyn和.rel.plt:(刚才看表的时候有圈起来哦) R_AARCH64_GLOB_DA

    1.2K41

    深入浅出ELF

    ),静态编译的可执行文件 ET_DYN: 共享对象(shared object),动态编译的可执行文件或者动态库*.so ET_CORE: coredump文件 e_entry是程序的入口虚拟地址,注意不是...因为动态库本身是位置无关的(PIE),支持被加载到内存中的随机位置,因此为了程序中用到的符号可以被正确引用,需要对其进行重定向操作,指向对应符号的真实地址。...破解这种加固方法的策略就是将其从内存中复制出来并进行重建,重建的过程可根据segment对section进行还原,因为segment和section之间共享了许多内存空间,例如: $ readelf -...在介绍ELF类型的时候其实有提到,可执行文件可以有两种类型,即可执行类型(ET_EXEC)和共享对象(ET_DYN),一个动态链接的可执行程序默认是共享对象类型的: $ gcc hello.c -o hello...$ readelf -h hello | grep Type Type: DYN (Shared object file) 而动态库(.so)本身也是共享对象类型,他们之间的本质区别在于前者链接了

    81930

    扒一扒ELF文件

    ELF文件类型 2.1 可重定位目标文件(.o文件) 2.2 可执行目标文件(a.out文件) 2.3 共享对象文件(.so文件) 3. ELF文件作用 4....例如编译好的可执行文件a.out。 2.3 共享对象文件(.so文件)   用于和其他共享目标文件或者可重定位文件一起生成ELF目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。 3....从编译和链接角度看ELF文件 .symtab section   符号表,它存放在程序中定义和引用的函数和全局变量的信息。...共享库文件是一种特殊的可重定位目标。   2.ELF目标文件格式可以从编译链接角度和程序执行角度两个角度看,前者是可重定位目标格式,后者是可执行目标格式。...3.bss段在可执行目标文件中不会有它的空间,只有当可执行目标文件装载运行时,才会被分配内存(并且位于data段内存块之后),并且初始化为0。 本文参考《深入理解计算机系统》

    78120

    链接 动态链接 静态链接

    符号解析的目的是将每个符号引用和一个符号定义联系起来 重定位 编译器和汇编器生成从地址零开始的代码和数据节。...ELF文件,现在就来看看经过静态链接生成的可执行目标文件的ELF文件格式,这里面都是以段作为术语的: 可执行目标文件的ELF文件 ELF头部 段头表 .init .text .rodata .data....bss .symtab .debug .line .strtab 节头表 随即这些段就会被加载到存储器地址中,也就是大名鼎鼎的存储器结构,包含栈堆,内核等等的结构。...像一些glibc提供的函数,我们可能随时随处都会用上,如果我们每次把函数的代码复制到每个进程的文本段中,这无疑是一种浪费资源,所以出来了共享库的概念,在运行时,可以加载到任意的存储器地址,并在存储器中和一个程序链接起来...共享库也叫共享目标,以.so为结尾,像linux系统提供了dlopen这样函数去加载和链接共享库。 其实.symtab这个存放符号的地方也是值得研究的,有机会再记录。

    2.9K30

    从程序员角度看ELF

    (这里针对ELF可执行文件,对于共享库的.init段,还是由interpreter来调用的!!!...这里特定的解释器是动态链接器,即ld.so,它自己也是ELF   共享库的格式。...链接器然后通过指向程序符号表和链接器自己的符号表的若干指针来初始化一个符号   表链。从概念上讲,程序文件和所有加载到进程中的库会共享一个符号表。...但实际中链接器   并不是在运行时创建一个合并后的符号表,而是将个个文件中的符号表组成一个符号表链。   ...链接器可以通过计算符号的散列值,然后访问相应的散列队列进行查找以加速   符号搜索的速度。   库的查找   链接器自身的初始化完成之后,它就会去寻找程序所需要的各个库。

    1K40

    Linux 程序编译过程详解

    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。...静态库和动态库的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。...ldd:可以用于查看一个可执行程序依赖的共享库。objcopy:将一种对象文件翻译成另一种格式,譬如将.bin转换成.elf、或者将.elf转换成.bin等。objdump:主要的作用是反汇编。...链接器将函数的代码从其所在地(不同的目标文件或静态链接库中)拷贝到最终的可执行程序中。...为创建可执行文件,链接器必须要完成的主要任务是:符号解析(把目标文件中符号的定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号的引用)。

    1.9K30

    PWN从入门到放弃(7)——栈溢出之ret2libc

    当这两个程序运行时,内存中同样也就包含了这两个相同的模块,这也就使得内存空间被浪费。当系统中包含大量类似lib.o这种被多个程序共享的模块时,也就会造成很大空间的浪费。...Linux系统中,ELF动态链接文件被称为动态共享对象(Dynamic Shared Objects),简称共享对象一般都是以 “.so” 为扩展名的文件,在pwn中我们常称之为libc库;在windows...计算偏移量和覆盖返回地址不再演示,和之前一样,这里主要讲解一下payload的构造。 32位ELF程序通过栈来传递参数,而64位ELF程序则是通过rdi寄存器来传递参数。...我们已经成功将puts函数的实际地址打印出来。 那么接下来就简单许多,我们需要计算libc的基地址,并利用libc基地址来计算system()函数和/bin/sh字符串的地址。...接下来计算system()和/bin/sh的地址。

    1.3K10

    Linux 程序编译过程的来龙去脉

    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。...静态库和动态库的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。...ldd:可以用于查看一个可执行程序依赖的共享库。 objcopy:将一种对象文件翻译成另一种格式,譬如将.bin转换成.elf、或者将.elf转换成.bin等。 objdump:主要的作用是反汇编。...链接器将函数的代码从其所在地(不同的目标文件或静态链接库中)拷贝到最终的可执行程序中。...为创建可执行文件,链接器必须要完成的主要任务是:符号解析(把目标文件中符号的定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号的引用)。

    3K30

    Linux 程序编译过程详解

    1 大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。...静态库和动态库的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。...ldd:可以用于查看一个可执行程序依赖的共享库。 objcopy:将一种对象文件翻译成另一种格式,譬如将.bin转换成.elf、或者将.elf转换成.bin等。 objdump:主要的作用是反汇编。...链接器将函数的代码从其所在地(不同的目标文件或静态链接库中)拷贝到最终的可执行程序中。...为创建可执行文件,链接器必须要完成的主要任务是:符号解析(把目标文件中符号的定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号的引用)。

    1.9K30

    后台开发:核心技术与应用实践 -- 编译与调试

    链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确的衔接。从原理上讲,它的工作就是把一些指令对其他符号地址的引用加以修正。...在运行时,动态链接器拿它和一个可执行的目标文件以及另外一些可共享的目标文件 ( .so ) 来 起处理,在 Linux 系统里面创建一个进程映像 有两种视图可以来说明 ELF 的组成格式,即链接视图和执行视图...组成不同的可重定位文件,以参与可执行文件或者可被共享的对象文件的链接。2. 组成可执行文件或者可被共享的对象文件,以在运行时内存中进程映像的构建。构建对象文件组成如表: ?...ELF 文件头被固定地放在不同类对象文件的最前面 因此,我们可以用 file 命令来看文件是属于哪种 ELF 文件,如下: ?...、变量名,所代替的全是运行时的内存地址。

    77010

    ELF文件格式简介

    另外,不同对象文件类型的符号表条目对 st_value 成员的解释略有不同: 在重定位文件中在可重定位文件中,st_value保存节索引为SHN_COMMON的符号的对齐约束; 在可重定位文件中,st_value...也就是说,st_value是从st_shndx标识的部分的开头的偏移量; 在可执行文件和共享对象文件中,st_value保存一个虚拟地址。...15)]:预留位,用于特殊处理器的特定含义; TYPE: STT_NOTYPE(0):符号的类型未指定; STT_OBJECT(1):符号与数据对象相关联,例如变量、数组等; STT_FUNC(2):...当链接编辑器将此对象文件与另一个定义指定符号的文件组合时,此文件对符号的引用将链接到实际定义; st_other:该成员当前持有 0 并且没有定义的含义; st_shndx:每个符号都有属于的节,当前成员存储的就是对应节的索引...这是因为dynsym中的符号只有在动态链接时也就是运行时才能被解析。

    2.2K31

    ELF文件格式解析

    另外将Section Header放到Sections下面的好处是,程序在运行时只需加载整个ELF文件的上面三个部分即可,而最后的Section Header可以忽略。...Elf32_Word sh_addralign; //某些节区带有地址对齐约束. Elf32_Word sh_entsize; //某些节区中包含固定大小的项目,如符号表。...依赖于具体的上下文,可能是一个绝对值、一个地址等等。 Elf32_Word st_size; //符号的尺寸大小。例如一个数据对象的大小是对象中包含的字节数。...替代在可执行文件中的符号搜索,动态连接器从它自己的共享object开始。假如一个共享的object提供引用参考失败,那么动态连接器再照常的搜索可执行文件和其他的共享object。...Elf32_Off p_offset; //此成员给出从文件头到该段第一个字节的偏移 Elf32_Addr p_vaddr; //此成员给出段的第一个字节将被放到内存中的虚拟地址

    2.6K40
    领券