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

创建共享对象时,不能使用针对`.text的重定位R_X86_64_32S

创建共享对象时,不能使用针对.text的重定位R_X86_64_32S

在云计算领域中,创建共享对象是指在软件开发过程中,将一些可重复使用的代码、函数或数据封装成一个独立的模块,以便在不同的应用程序中共享和复用。共享对象可以提高代码的可维护性和可重用性,减少开发工作量。

重定位(relocation)是指在程序执行或加载过程中,将程序中使用的符号地址映射到实际的内存地址的过程。在创建共享对象时,重定位是一个重要的步骤,它确保共享对象能够正确地链接和加载到应用程序中。

.text是一个程序段(section),它存储了可执行代码的指令。R_X86_64_32S是一种特定的重定位类型,用于将32位符号地址映射到64位目标地址。

然而,针对.text的重定位R_X86_64_32S在创建共享对象时是不允许的。这是因为在64位系统中,.text段中的指令使用的是64位地址,而R_X86_64_32S只能将32位符号地址映射到64位目标地址,无法正确处理64位地址的重定位。

为了解决这个问题,可以使用针对.text的其他适合64位地址的重定位类型,例如R_X86_64_PC32。这种重定位类型可以将32位相对地址映射到64位目标地址,适用于64位系统中的共享对象创建过程。

腾讯云提供了一系列的云计算产品,包括云服务器、云数据库、云存储等,可以满足不同场景下的需求。具体推荐的产品和产品介绍链接地址可以根据实际需求和情况进行选择。

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

相关·内容

ELF文件及android hook原理

ELF文件主要有四种类型: 可重定位文件(Relocatable File) 包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。...比如”.rel.text”就是针对”.text”的重定位表,”.rel.data”就是针对”.data”的重定位表。...我们还需要有一种更好的方法解决共享对象指令中对绝对地址的重定位问题。...程序开始执行时,动态链接器都要进行一次链接工作,会寻找并装载所需的共享对象,然后进行符号查找地址重定位等工作,如此一来,程序的运行速度必定会减慢。....dynamic段 这个段里保存了动态链接器所需要的基本信息,比如依赖哪些共享对象、动态链接符号表的位置、动态链接重定位表的位置、共享对象初始化代码的地址等。

3.9K81

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

符号表也是段 elf文件头结构 elf文件类型:重定位/可执行文件/共享文件类型 EM:可运行的CPU平台 eshotoff:段表的偏移 使用readelf -S可以查看 详细的段表内存储的段信息 每个...比如SimpleSection.o中的“.rel.text”就是针对“.text”段的重定位表,因为“.text”段中至少有一个绝对地址的引用,那就是对“printf”函数的调用;而“.data”段则没有对绝对地址的引用...,它只包含了几个常量,所以SimpleSection.o中没有针对“.data”段的重定位表“.rel.data”。...另外一个减慢运行速度的原因是动态链接的链接工作在运行时完成,即程序开始执行时,动态链接器都要进行一次链接工作,正如我们上面提到的,动态链接器会寻找并装载所需要的共享对象,然后进行符号查找地址重定位等工作...但这不能改变它需要重定位的本质 对于使用PIC技术的可执行文件或共享对象来说,虽然它们的代码段不需要重定位(因为地址无关,动态链接器加载完模块后会修正got里面记录的地址) ,但是数据段每个进程都会加载

9910
  • CSAPP---第七章-链接

    ---- 目标文件 目标文件有三种形式: 可重定位目标文件: 包含二进制代码和数据,编译时可以和其他可重定位文件合并起来,创建一个可执行目标文件。...当源代码经过编译生成可重定位目标文件后,其中无法识别的符号引用,对应的call调用或者引用地址会被设置为0,等到链接重定位时进行地址。修正 代码的重定位条目放在 .rel.text 中。....text、.rodata 和 .data 节与可重定位目标文件中的节是相似的,除了这些节已经被重定位到它们最终的运行时内存地址以外。....这里涉及到CSAPP第九章要讲的虚拟内存机制,该章节中会探讨如何实现库的共享 静态库和共享库构造对比如下: 动态链接基本的思路是当创建可执行文件时,静态执行一些链接,然后在程序加载时,动态完成链接过程...因此,printf函数地址只能回写到数据段内,而不能回写到代码段上。 注意:刚才谈到的回写,是指运行时修改,更专业的称谓应该是运行时重定位,与之相对应的还有链接时重定位。

    92310

    动态链接的相关结构

    动态链接重定位表 共享对象需要重定位的主要原因是导入符号的存在。...但是在动态链接中,导入符号的地址在运行时才确定,所以需要在运行时将这些导入符号的引用修正,即需要重定位; 我们在前面地址无关章节中也提到过,动态链接的可执行文件使用的是PIC方法,但这不能改变它需要重定位的本质...对于动态链接来说,如果一个共享对象不是以PIC模式编译的,那么毫无疑问,它是需要在装载时被重定位的:如果一个共享对象是PIC模式编译的,那么它还需要再装载时进行重定位吗?...是的,PIC的共享对象也是需要重定位的; 对于使用PIC技术的可执行文件或共享对象来说,虽然它们的代码段不需要重定位(因为地址无关),但是数据段还包含了绝对地址的引用,因为代码段中绝对地址相关的部分被分离了出来...动态链接重定位的相关结构 共享对象的重定位与我们在前面“静态链接”中分析过的目标文件的重定位十分类似,唯一有区别的是目标文件的重定位是在静态链接时完成的,而共享对象的重定位是在装载时完成的。

    1.7K20

    地址无关码

    这个问题的另一种表述就是:共享对象在编译时不能假设自己在进程虚拟地址空间中的位置。...Linux和GCC支持这种装载时重定位的方法,我们前面在产生共享对象时,使用了两个GCC参数“shared”和“-fPIC”,如果只使用“- shared”,那么输出的共享对象就是使用装载时重定位的方法...由于可执行文件在运行时并不进行代码重定位,所以变量的地址必须在链接过程中确定下来。为了能够使得链接过程正常进行,链接器会在创建可执行文件时,在它的“bss”段创建一个 global变量的副本。...当动态 链接器装载共享对象时,如果发现该共享对象有这样的重定位入口,那么动态链接器就会对 该共享对象进行重定位。 实际上,我们甚至可以让代码段也使用这种装载时重定位的方法,而不使用地址无关代码。...$gcc -shared pic. c -o pic. so 上面这个命令就会产生一个不使用地址无关代码而使用装载时重定位的共享对象。

    1K20

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

    4、装载、动态链接与重定位 4.1、装载 这个很好理解,我们在使用一个动态库内的函数时,都要先对其进行加载,在android中,我们通常是使用System.loadLibrary的方式加载我们的目标共享库...4.3、重定位 共享库需要重定位的主要原因是导入符号的存在。...动态链接下,无论是可执行文件或共享对象,一旦它依赖于其他共享对象,也就是说有导入的符号时(比如fwrite函数),那么它的代码或数据中就会有对于导入符号的引用。...在编译时这些导入符号的地址未知,在运行时才确定,所以需要在运行时将这些导入符号的引用修正,即需要重定位。...5、PLT与GOT 前面的过程装载->动态链接->重定位完成之后,目标共享库的基址已经确定了,当我们调用某个函数时(比如fwrite函数),调用函数并不是直接调用原始fwrite函数的函数地址,它会先经过

    3.6K20

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

    链接器使用汇编器产生的重定位条目( relocation entry)的详细指令,不加甄别地执行这样的重定位。 目标文件   目标文件有三种形式:   可重定位目标文件。...包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件可执行目标文件。包含二进制代码和数据,其形式可以被直接复制到内存并执行。 可执行目标文件。...共享目标文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。   编译器和汇编器生成可重定位目标文件(包括共享目标文件)。链接器生成可执行目标文件。...它们对应于带 static属性的C函数和全局变量。这些符号在模块m中任何位置都可见,但是不能被其他模块引用。 如何解析多重定义的全局符号   链接器的输入是一组可重定位目标模块。...在加载时,加载器将部分链接的可执行文件映射到内存,然后调用动态链接器,它通过加载共享库和重定位程序中的引用来完成链接任务。

    2.6K31

    一文领略链接与装载

    装载时重定位 共享对象并非完全能被多个进程复用(参照上面共享对象实现的图),一般只有指令部分是进程共享的,而数据部分仍然是进程独立的。...和目标文件一样,共享对象数据段中若有绝对地址引用,会生成对应的重定位表,当动态链接器把这个共享对象装载后,会根据重定位表将数据段中的地址引用修正。这个方法叫做 装载时重定位 。...对于共享对象的指令部分来说,无法使用装载时重定位来处理 。因为我们说的装载实际上是指装载到虚拟空间,那指令部分的绝对地址引用就需要根据当前进程的虚拟地址进行修正。...如果一个共享对象中使用相对寻址访问这个全局符号,发生全局符号介入时就可能需要对这个引用重定位了,那么这个共享对象的指令部分就不能实现 PIC 了。所以对于全局符号来说,同样采用 GOT 方式来访问。...这些眼熟的表名字实际上功能结构和静态链接时那些表非常相似。最大的区别就是目标文件的重定位是在静态链接时完成,共享对象的重定位是在装载时完成。 值得提出的是可执行文件也可以编译为共享对象形式。

    98831

    扒一扒ELF文件

    ELF文件类型 2.1 可重定位目标文件(.o文件) 2.2 可执行目标文件(a.out文件) 2.3 共享对象文件(.so文件) 3. ELF文件作用 4....例如编译好的可执行文件a.out。 2.3 共享对象文件(.so文件)   用于和其他共享目标文件或者可重定位文件一起生成ELF目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。 3.....rel.txt section   .text节的重定位信息,用于重新修改代码段的指令中的地址信息。....rel.data section   .data节的重定位信息,用于对被模块使用或定义的全局变量进行重定位的信息。 .debug section   调试用的符号表。...共享库文件是一种特殊的可重定位目标。   2.ELF目标文件格式可以从编译链接角度和程序执行角度两个角度看,前者是可重定位目标格式,后者是可执行目标格式。

    78020

    动态链接的步骤与实现

    他也可以依赖其他共享对象,其中的被依赖共享对象由动态链接器负责链接和装载。可是对于动态链接器来说,它的重定位工作由谁来完成?它是否可以依赖于其他共享对象?...在编写动态链接器时必须保证不使用任何系统库,运行库;对于第二个条件,动态链接器必须在启动时有一段非常精巧的代码可以完成这项艰巨的工作而同时又不能使用全局和静态变量。...其实我们在前面分析地址无关代码时已经提到过,实际上使用PIC模式编译的共享对象,对于模块内部的函数调用也是采用跟模块外部函数调用一样的方式,即使用 GOT/PLT的方式,所以在 GOT/PLT没有被重定位之前...重定位与初始化 当上面的步骤完成之后,链接器开始重新遍历可执行的文件和每个共享对象的重定位表,将它们的GOT/PLT的每个需要重定位的位置进行修正。...在前面介绍动态链接的重定位表时,我们已经碰到了几种重定位类型,每种重定位入口地址的计算方法我们在这里就不再重复介绍了。

    1.4K20

    JavaWeb核心篇(2)——Request和Response

    是基于ServletRequest接口创建的针对Http协议的请求对象接口 我们在使用Request对象时,也常常使用HttpServletRequest接口 Request获得请求数据 Request...对象被创建的主要目的就是获得请求数据 我们将根据HTTP请求数据对象的三种格式分开介绍获得请求数据方法 请求行: 请求行格式: GET/request-demo/req1?...: 我们在使用Response时,也以HttpServletResponse为主 设置响应数据 和获取数据相同,我们把函数根据响应数据的三部分分别展示: 响应行: 响应行格式: HTTP/1.1 200...首先我们介绍一下重定位: 重定位:一种资源跳转方式 客户端向服务器A发出请求,当该资源A无法满足客户端发出的请求,资源A返回响应(响应码302表示无法处理,并给出响应头location:xxx告诉客户端应该去哪个资源...("资源B的路径") 重定位特点: 浏览器地址栏路径发生变化 可以重定位到任意位置的资源(服务器内部,外部均可以) 两次请求,不能在多个资源使用request共享数据 下面给出代码示例: package

    43910

    ELF文件从形成到加载轮廓

    包含适合与其他目标文件链接,以创建可执行文件或共享目标文件的代码和数据。 这些文件是在编译阶段生成的,通常通过 gcc -c 命令生成,尚未进行最终的地址解析和链接。...记录每个段的起始位置、偏移量和长度,因为这些段在二进制文件中紧密排列,程序头表提供必要的描述信息以区分和加载这些段。 主要用于可执行文件和共享库,在加载时由操作系统或动态链接器使用。....rela:重定位表,记录需要调整地址的符号引用位置,链接器根据此表修正地址。 .debug:调试信息,包含源代码行号、变量名和类型等,供调试工具(如 gdb)使用。...DYNAMIC:动态链接信息,包含共享库依赖和符号解析数据。 GNU_STACK:栈段的权限设置(通常可读写)。 GNU_RELRO:只读重定位段,保护动态链接后的数据免受修改。...Type 字段区分文件类型:REL(可重定位)、EXEC(可执行)、DYN(共享对象)。

    4610

    解锁动静态库的神秘力量2:从代码片段到高效程序的蜕变(续篇)

    一·ELF文件: 1.1ELF文件概念: 首先我们要先命名它是什么;然后下面再介绍它的组成。 就是xxx.o⽂件;包含适合于与其他⽬标⽂件链接来创建可执⾏⽂件或者共享⽬标⽂件的代码和数据。...got节和.plt节⼀起提供了对导⼊的共享库函数的访问⼊。由动态链接器在运⾏时进⾏修改。...就是每个进程,每个动态库都有独立的GOT表,所以进程间不能共享GOT表。 我们的got存在于可执行文件或者动态库里面.data 里。...与其在程序一开始就对所有函数进行重定位,不如将这个过程推迟到函数第一次被调用的时候,因为绝大多数动态库中的函数可能在程序运行期间一次都不会被使用到。...⽅式进⾏调⽤( 运⾏重定位,也叫做动态地址重定位 )。

    8510

    深入理解编译、链接和运行(obj文件组成格式分析,可执行文件组成格式分析)

    (3)共享库 如果程序中用到了库函数,如printf、scanf、puts、gets等。则在共享库中包含了这些函数的定义。...//.bss return 0; //.text } //.bss共占24个字节 .data共占12个字节 编译生成可重定位的二进制文件: 编译 整个编译过程分为预编译...针对编译和链接过程,提出以下需要解决的问题: (1)编译的过程是怎么样的? (2)obj文件的组成格式是什么,它为什么不能执行?...2.file main.o 在上边两个图中,可以得出这样的一个结论。.obj是一个二进制可重定位文件,不能执行,并不是一个executable的文件。.../a.out 创建虚拟地址空间到物理内存的映射(创建内核地址映射结构体),创建页目录和页表。 (2)加载代码段和数据段。

    2K30

    CVE-2017-12824及利用样本分析

    0x02.2静态分析 由于笔者重新找到可以调试使用的POC,故直接使用Bitter组织某样作为调试对象。...创建一名为QPONMLKJIH的互斥对象,并调用GetLastError检查是否已存在该名称的互斥对象(0xB7,ERROR_ALREADY_EXISTS): image.png 为DLL文件申请SizeofImage...接下来对DLL文件进行重定位。检查基址重定位表大小是否为0: ? 检查IMAGE_BASE_RELOCATION结构大小是否为0: ? 根据重定位项数组中的重定位数据进行重定位: ?...依次更改.text、.rdata、rsrc区块所在内存区域的保护属性: image.png 调用DLL文件中一函数过程: image.png 其功能为创建一新线程: ?...0x06 参考 •Wikipedia——https://en.wikipedia.org/wiki/InPage•蔓灵花(BITTER)APT组织使用InPage软件漏洞针对巴基斯坦的攻击及团伙关联分析

    82410

    java学习八股之JVM-内存划分-垃圾回收器-回收算法-双亲委派-三色标记

    私有线程安全,共享不安全 堆:JVM回收的主要区域,存放对象信息,分为新生代和老年代,新生代的eden取内存不够发送MinorGC,老年代内存不够发送FullGC 通过new关键字创建对象使用堆内存...它存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括特殊方法,用于类和实例初始化以及接口初始化,方法区域是在虚拟机启动时创建的。...,清楚边界外的垃圾对象,标记清楚和整理由垃圾回收期决定使用哪一种,用在老年代 复制算法:内存一分为二,只使用一块,gc时将活着的对象移动带另一块,然后清空之前的区域,用在新生代的eden区和survice...清除会清理标记为不可用的对象. roots重定位:是对存活的对象进行移动,以腾出大块内存空间,减少碎片产生.重定位最开始会StopTheWorld,却决于重定位集与对象总活动集的比例....并发重定位与并发标记类似. 流程还是同cms类似 12.

    20630

    ELF文件格式简介

    存储可重定位表项,可能会有附加内容,目标文件可能有多个可重定位表项; 此种类型节的sh_link存储相关符号表的节索引,sh_info存储重定位所使用节的索引; SHT_HASH(5):存储符号哈希表...:一组目标文件、库、系统共享资源和其他共享库链接在一起创建可执行文件。...因此.text的重定位部分通常具有名称.rel.text或.rela.text; .relaname,类型SHT_RELA:同relname。...符号表中保存的字符串是节名和目标文件中使用到的符号。而需要使用对应字符串时,只需要在需要使用的地方指明对应字符在字符串表中的索引即可,使用的字符串就是索引处到第一个\0之间的字符串。...另外,不同对象文件类型的符号表条目对 st_value 成员的解释略有不同: 在重定位文件中在可重定位文件中,st_value保存节索引为SHN_COMMON的符号的对齐约束; 在可重定位文件中,st_value

    2.2K31

    编译器、链接器和解释器

    重定位(Relocation): 目标文件和库文件通常会包含相对于文件起始位置的相对地址,这些地址需要在最终可执行文件中被映射到正确的内存地址上。...链接器会遍历目标文件中的重定位信息(.relo.text、.relo.data),将这些相对地址替换为实际的绝对地址。这样,可执行文件就可以正确地在内存中加载和执行。 3....这些库代码和数据存储在系统的共享库中(也称为动态链接库或共享对象,如 .so 或 .dll 文件)。多个程序可以共享同一个库的实例,减少了存储空间和系统资源的浪费。...运行时的动态链接:共享库已经在加载时加载到了内存中,但链接的最终步骤是在程序运行时进行的。这时,操作系统会确保程序可以正确地访问所需的共享库中的函数和变量。...生成可执行文件(Executable File Generation): 在完成所有的符号解析、重定位和库依赖解析后,链接器会根据上述步骤的结果生成最终的可执行文件。

    33420

    【Linux随笔】Linux的动态库管理工具ldconfig和ldd

    我们常用来用来查看程序运行所需的共享库,用来解决程序因缺少某个库文件而不能运行的一些问题。...--version:打印指令版本号; -v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; -d:执行重定位和报告任何丢失的对象; -r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数...如果使用 ldd 命令时没有找到对应的共享库文件和其具体位置,可能是两种情况引起的: 1、共享库没有安装在该系统中; 2、共享库保存在 /etc/ld.so.conf 文件列出的搜索路径之外的位置。...ldconfig用途:用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序...语法: -v或--verbose:用此选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字。

    3.2K20
    领券