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

创建共享对象时,不能使用针对未定义的隐藏符号`__dso_handle的重定位R_X86_64_PC32

这个问题涉及到共享对象的创建和重定位。共享对象是一种可重用的二进制代码和数据的形式,可以在不同的程序之间共享使用。在创建共享对象时,编译器会将代码和数据打包成一个可执行文件,并生成一些符号表用于链接和重定位。

在这个问题中,出现了一个重定位错误。重定位是指在链接过程中,将符号引用与符号定义进行匹配的过程。在共享对象的创建过程中,编译器会将代码中的符号引用与其他共享对象或主程序中的符号定义进行匹配。如果找不到符号的定义,就会出现未定义符号的错误。

具体到这个问题中,错误信息指出不能使用针对未定义的隐藏符号__dso_handle的重定位R_X86_64_PC32。__dso_handle是一个隐藏符号,用于处理共享对象的构造和析构函数。重定位类型R_X86_64_PC32表示对32位PC相对地址的重定位。

解决这个问题的方法是确保在创建共享对象时,所有的符号引用都能够找到符号定义。可以通过以下几种方式解决:

  1. 确保所有的依赖库都正确链接:检查共享对象所依赖的库是否正确链接,并且库的路径正确。可以使用ldd命令检查共享对象的依赖关系。
  2. 检查编译选项:检查编译共享对象时使用的选项是否正确。特别是与链接相关的选项,如-l和-L选项,确保正确指定了库的路径和名称。
  3. 检查符号定义:检查共享对象中使用的符号是否在其他地方有定义。可以使用nm命令查看共享对象的符号表,确认是否存在未定义的符号。
  4. 检查版本兼容性:如果共享对象使用的库有多个版本,可能会导致符号定义不匹配的问题。确保使用的库版本与编译时的版本一致。

总结起来,解决创建共享对象时不能使用针对未定义的隐藏符号`__dso_handle的重定位R_X86_64_PC32的问题,需要检查依赖库的链接、编译选项、符号定义和版本兼容性等方面的问题。具体的解决方法需要根据具体情况进行调试和排查。

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

相关·内容

Linux命令(63)——nm令

它表示一个符号如果被重定位引用,不会计算该符号的地址,而是必须在运行时计算 N 该符号是一个debugging符号。...对于全局变量来说,在定义它的文件中,其符号类型为B或D,在使用它的文件中,其类型为U。 v,V 该符号是一个弱符号。当弱定义符号与正常定义符号链接时,使用正常定义符号时不会出错。...当链接未定义的弱定义符号,弱符号的值将变为零,且没有错误。在某些系统上,大写表示已指定默认值 w,W 该符号是一个弱符号,未专门标记为弱对象符号。...当弱定义符号与正常定义符号链接时,使用正常定义符号时不会出错。当链接未定义的弱未定义符号时,该符号的值将以系统特定的方式确定,且不会出错。...对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。

5.2K00

程序一定要从main函数开始运行吗?

符号解析与重定位:使用第一步收集到的所有信息,读取输入文件中段的数据及重定位信息,进行符号解析和重定位,调整代码中的地址,将每个段中需要重定位的指令和数据进行“修补”,使他们都指向正确的位置。...对于那些需要重定位的符号,都会放在重定位表里,也叫重定位段,即.rel.data、.rel.text等,如果.text段有被重定位的地方,就有.rel.text段,如果.data段有被重定位的地方,就有...可以使用objdump查看目标文件的重定位表。...U puts 对于UND类型,这种未定义的符号都是因为该目标文件中有关于他们的重定位项,在链接器扫描完所有的输入目标文件后,所有这种未定义的符号都应该能在全局符号表中找到,否则报符号未定义错误。...,要先初始化进程执行环境,如堆分配初始化、线程子系统等,C++的全局对象构造函数也是这一时期被执行的,全局析构函数是main之后执行的。

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

    ,它只包含了几个常量,所以SimpleSection.o中没有针对“.data”段的重定位表“.rel.data”。...,所以直接找这种符号是否可以在全局符号表中找到就行,不需要对比重定位,效率确实可以高一点 原文:“undefined”未定义类型,这种未定义的符号都是因为该目标文件中有关于它们的重定位项。...另外一个减慢运行速度的原因是动态链接的链接工作在运行时完成,即程序开始执行时,动态链接器都要进行一次链接工作,正如我们上面提到的,动态链接器会寻找并装载所需要的共享对象,然后进行符号查找地址重定位等工作...动态链接中的重定位表 程序里面会使用动态链接的符号和函数,这些都需要运行的时候才能知道,所以运行的时候加载完库需要把程序里面用的符号重定位到加载后的符号地址 虽然动态链接的可执行文件使用的是PIC方法,...但这不能改变它需要重定位的本质 对于使用PIC技术的可执行文件或共享对象来说,虽然它们的代码段不需要重定位(因为地址无关,动态链接器加载完模块后会修正got里面记录的地址) ,但是数据段每个进程都会加载

    9910

    ELF文件格式简介

    (2):保存了符号信息,用于重定位; 此种类型节的sh_link存储相关字符串表的节索引,sh_info存储最后一个局部符号的符号表索引+1; SHT_DYNSYM(11):保存共享库导入动态符号信息...存储可重定位表项,可能会有附加内容,目标文件可能有多个可重定位表项; 此种类型节的sh_link存储相关符号表的节索引,sh_info存储重定位所使用节的索引; SHT_HASH(5):存储符号哈希表...符号表中保存的字符串是节名和目标文件中使用到的符号。而需要使用对应字符串时,只需要在需要使用的地方指明对应字符在字符串表中的索引即可,使用的字符串就是索引处到第一个\0之间的字符串。...2.5 符号表   目标文件的符号表包含定位和重定位程序的符号定义和引用所需的信息。符号表索引是该数组的下标。索引0既指定表中的第一个条目,又用作未定义的符号索引。...另外,不同对象文件类型的符号表条目对 st_value 成员的解释略有不同: 在重定位文件中在可重定位文件中,st_value保存节索引为SHN_COMMON的符号的对齐约束; 在可重定位文件中,st_value

    2.2K31

    一文领略链接与装载

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

    98731

    Linux命令(65)——ld命令

    >,--mri-script=:为与MRI链接器兼容,ld接受由MRI命令语言编写的脚本文件 --cref:创建跨引用表 -d,-dc,-dp:即使指定了可重定位的输出文件...-E,--export-dynamic:对于ELF格式文件,创建动态链接的可执行文件时,把所有符号添加到动态符号表 -f ,--auxiliary=:对于ELF格式共享对象,设置...这告诉动态链接器,正在创建的共享对象的符号表应该用作共享对象名称的符号表的筛选器。 -g:被忽略。...=:从指定的文件读取符号名称和地址 -r,--relocatable:生成可重定位的输出(称为部分连接) -rpath=:把指定的目录添加到运行时库搜索路径 -rpath-link...org>:使用指定的地址作为bss段的起始点 -t,--trace:在处理输入文件时显示它们的名称 -u ,--undefined=:强制指定符号在输出文件中作为未定义符号

    17.7K13

    深入理解计算机系统(第三版) CSAPP 杂谈,第7章:链接

    链接器主要完成符号解析和重定位两个任务。 目标文件有三种形式:可重定位目标文件(.so);可执行目标文件(.exe),共享目标文件(.so)。...linux x86-64 的可重定位目标文件使用 ELF 格式。....symtab:符号表,存放定义和引用的函数与全局变量的信息。使用 STRIP 命令可以去掉符号表。 .rel.text:.text 中位置的列表,是重定位信息。...—- 2018.12.14 —- .symtab 存储各 section 重定位信息 弱全局符号是未赋值的全局符号,会被强全局符号覆盖,包括类型,所以容易导致类型不匹配的细微的bug;强全局符号是初始化的全局符号...遇到目标文件 .o 时会把未定义和已定义的符号保存起来,遇到存档文件 .a 时,除了前面的操作,还会把 .a 的成员符号与未定义的符号比较,把匹配的成员符号对应的 .o 链接起来。

    1.1K30

    叙述 C语言编译

    链接(Linking) 主要是在不同模块间对符号进行重定位 在ELF文件 hello.o 里保存一张重定位表(relocation table),保存了其他地方的函数、变量(统称符号)的名字和地址。...使用nm可以查看文件的符号定义, 可以看到 "U", 表示该符号未定义。...而当我手动尝试链接的时候,又被提示一堆未定义,而这些工作gcc会自动递归查找去解决。 $ gcc -static hello.c $ ....,应用体积减小了很多,但是看到printf提示未定义,标记改了,表示是一个动态链接。...GOT中的信息需要在动态链接库被程序加载后立刻填写正确。这就给采用动态链接库的程序在启动时带来了一定额外开销,从而减缓了启动速度。ELF采用了做延迟绑定的做法来解决这一问题。

    1.8K11

    ELF文件及android hook原理

    比如”.rel.text”就是针对”.text”的重定位表,”.rel.data”就是针对”.data”的重定位表。...第二步 符号解析与重定位 使用第一步中收集到的信息,读取输入文件中段的数据、重定位信息,并且进行符号解析与重定位、调整代码中的地址等 使用ld链接器将”a.o”和”b.o”链接起来: $ld a.o b.o...我们还需要有一种更好的方法解决共享对象指令中对绝对地址的重定位问题。...程序开始执行时,动态链接器都要进行一次链接工作,会寻找并装载所需的共享对象,然后进行符号查找地址重定位等工作,如此一来,程序的运行速度必定会减慢。....dynamic段 这个段里保存了动态链接器所需要的基本信息,比如依赖哪些共享对象、动态链接符号表的位置、动态链接重定位表的位置、共享对象初始化代码的地址等。

    3.9K81

    CSAPP---第七章-链接

    ---- 目标文件 目标文件有三种形式: 可重定位目标文件: 包含二进制代码和数据,编译时可以和其他可重定位文件合并起来,创建一个可执行目标文件。...count是全局符号,根据type可知符号表示是一个数据对象类型,它所在节头部表索引为3,可以定位到.data节中,再根据value表示在.data节中的偏移量得到对象地址,size表示对象大小。...链接器维护一个可重定位目标文件的集合E,这个集合中的文件会被合并起来形成可执行文件。 一个未解析的符号集合U,即引用了但是尚未定义的符号集合。 一个在前面输入文件中已经定义的符号集合D。...否则,它会合并和重定位E中的目标文件,构建输出可执行文件。 注意:如果定义一个符号的库出现在引用这个符号的目标文件之前,那么引用就不能被解析,链接会失败。...因此,printf函数地址只能回写到数据段内,而不能回写到代码段上。 注意:刚才谈到的回写,是指运行时修改,更专业的称谓应该是运行时重定位,与之相对应的还有链接时重定位。

    92110

    体系结构复习笔记

    链接器 14.1 目的 Modularity Efficiency 14.2 功能 符号解析(Symbol resolution) 重定位(Relocation) 14.3 三种目标文件 可重定位目标文件...ABS:代表不应该被重定向的符号 UNDEF:代表未定义的符号,即在本模块引用在其他模块定义的符号 COMMON:表示还未被分配位置的为初始化的数据目标 【注】只有可重定位目标文件才有这些伪节,可执行目标文件没有...静态库解析 在符号解析阶段,链接器从左到右按照它们在编译器驱动程序命令行上出现的顺序来扫描可重定位目标文件和存档文件。...在扫描过程中,链接器维护一个可重定位目标文件集合E、一个未解析(即已引用但尚未定义)的符号集合U、一个已定义的符号集合D 缺点: 存储时磁盘空间存在大量冗余 运行时内存空间存在大量冗余 库更新导致所有程序需要显示重新链接...动态库解析 链接:加载时或运行时 库打桩机制: 编译时:显示函数包装 链接时:链接符号时替换 加载/运行时:通过dlsym实现定制版函数 14.4 重定位 15.

    2.4K30

    符号解析与重定位

    1.重定位 在完成空间与地址的分配步骤之后,链接器就进入了符号解析与重定位的步骤,这也就是静态链接的核心作用; 在分析符号解析和重定位之前,首先让我们来看看“a.o”里面是怎么使用这两个外部符号,也就是说我们在...我们可以使用 objdump来查看目标文件的重定位表。 这个命令可以用来查看“ao”里面要重定位的地方,即“a.o”所有引用到外部符号的地址。...链接器就会发现 shared和swap两个符号没有被定义,没有办法完成链接工作: 这也是我们平时在编写程序的时候最常碰到的问题之一,就是链接时符号未定义。...重定位的过程中,每个重定位的入口都是对一个符号的引用,那么当链接器须要对某个符号的引用进行重定位时,它就要确定这个符号的目标地址。...比如我们查看“a.o”的符号表: GLOBAL”类型的符号,除了“main”函数是定义在代码段之外,其他两个“ shared和“swap”都是“UND”,即“ undefined”未定义类型,这种未定义的符号都是因为该目标文件中有关于它们的重定位项

    1.3K10

    动态链接的步骤与实现

    在编写动态链接器时必须保证不使用任何系统库,运行库;对于第二个条件,动态链接器必须在启动时有一段非常精巧的代码可以完成这项艰巨的工作而同时又不能使用全局和静态变量。...其实我们在前面分析地址无关代码时已经提到过,实际上使用PIC模式编译的共享对象,对于模块内部的函数调用也是采用跟模块外部函数调用一样的方式,即使用 GOT/PLT的方式,所以在 GOT/PLT没有被重定位之前...由于存在这种重名符号被直接忽略的问题,当程序使用大量共享对象时应该非常小心符号的重名问题,如果两个符号重名又执行不同的功能,那么程序运行时可能会将所有该符号名的引用解析到第-个被加入全局符号表的使用该符号名的符号...重定位与初始化 当上面的步骤完成之后,链接器开始重新遍历可执行的文件和每个共享对象的重定位表,将它们的GOT/PLT的每个需要重定位的位置进行修正。...在前面介绍动态链接的重定位表时,我们已经碰到了几种重定位类型,每种重定位入口地址的计算方法我们在这里就不再重复介绍了。

    1.4K20

    【C语言】编译和链接深度剖析

    C语言中的链接实现符号决议和重定位的主要步骤如下: 汇编阶段生成对象文件(.o文件) 编译单个源文件后生成对应的对象文件。对象文件包含代码段、数据段以及符号表等信息。...链接阶段读取对象文件 链接器读取所有对象文件,并构建一个全局符号表。 符号决议 链接器检查全局符号表中是否存在重复定义或未定义的外部符号。如果有,报错;如果没有,继续下一步。...重定位 对每个对象文件: 扫描重定位表,获取需要重定位的位置。 查找位置对应的符号在全局符号表中的地址。 更新位置的值为符号地址。...符号表包含链接后符号的最终地址信息。 总结: 在C语言链接过程中,通过构建全局符号表实现符号决议,通过读取和修改重定位表实现符号地址的计算和重定位,从而生成可以直接执行的目标文件。...重定位: test.o重定位表中记录Add和g_val符号,链接器查找全局符号表,得到它们在add.o中的定义地址。

    13410

    C++系列:链接器是如何工作的

    当定义了静态变量或者静态函数时,到底会意味着什么?等等 4.理解链接过程有助于理解其他重要的系统概念。...由链接器生成的可执行对象文件许多重要系统功能中发挥着关键作用,比如程序加载、程序运行、虚拟内存、内存映射等; 5.理解链接有助于使用共享库。 多年来,链接被认为是相当直接和无趣的。...然而,随着共享库和动态链接在现代操作系统中的重要性越来越高,链接是一个复杂的过程,它为有知识的程序员提供了强大的功能。例如,许多软件产品在运行时使用共享库来升级压缩打包的二进制文件。...链接器的作用:简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。链接器还要完成程序中各目标文件的地址空间的组织,这可能涉及重定位工作。...这里还会有个新名词,什么是重定位呢? To:重定位,就是将每个符号和内存中的一个位置关联起来,然后修改代码中所有对这些符号的引用,使它们指向这个内存位置。

    1.8K40

    小心两个共享库共用同一个静态库

    小心两个共享库共用同一个静态库.pdf 注:以下内容仅针对Linux/GCC环境,不涵盖Windows,包括Cygwin环境。....html(Linux上制作可执行的共享库示例) 问1:如果测试中的全局变量global_var是个带构造和析构的类对象,会如何?...原因是在使用dlopen动态加载共享库时,如果静态库中包含有全局变量,可能会出现名同地址不同的全局变量。 解决办法:总是使用RTLD_GLOBAL加载共享库,而不是RTLD_LOCAL。...比如程序的公司名、发布版本号等 .line 调试时的行号表,即源代码行号与编译后指令的对应表 .hash 符号哈希表 .dynamic 动态链接信息 .debug 调试信息 .comment...表示不丢弃未定义的符号和需要重定位的符号 --export-dynamic 创建一个动态连接的可执行程序时, 把所有的符号加到动态符号表中

    2.7K50

    动态链接的相关结构

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

    1.7K20

    关于protobuf近期版本(v20v3.20+)和 gRPC v1.54版本在某些编译环境下的一些链接和编译问题

    这时候又会导致符号未定义。 我们发现问题的环境是编译iOS版本时,具体编译器版本号忘记了,好像是AppleClang 12或者AppleClang 13。...触发条件比较多: 需要编译成动态库 默认符号隐藏(Windows默认隐藏,Linux默认可见) 使用 dllexport_decl= 来设置导出符号 在Windows中个,每一个dll和exec都有自己的符号表和堆管理...所以当使用dll时,需要把要导出的符号设置为 __declspec(dllexport)/__attribute__((__dllexport__)), 导入的时候设置为 __declspec((dllimport...而在Linux里,默认是共享且全局可见的。而很多构建系统中会把Windows版本依赖使用静态库,所以很多同学不会碰到这些问题。...有兴趣的小伙伴也可以跟进。 gRPC 的链接和编译问题 gRPC 的 v1.54.0 的链接符号问题 我们在使用高版本编译器时,会尽可能使用高版本的STD标准。

    1.6K20

    我与C语言二周目邂逅vlog——8.编译和链接

    编译器在生成目标文件时,有些符号(如外部函数)并没有具体的地址信息,因此需要链接器来进行符号解析。 重定位:将目标文件中的地址信息进行调整,使得最终的可执行文件中的所有地址都指向正确的位置。...每个目标文件在编译时,生成的地址通常是相对的,而链接器需要将它们重定位为绝对地址,以便程序能够正确运行。 处理库文件:链接器还需要处理静态库和动态库。...类型错误:变量的类型不匹配,如将 int 变量赋值给 char 指针。 未定义的变量:使用未定义的变量或函数。 7.2 链接错误 链接错误是在链接阶段出现的问题,通常与符号解析和重定位有关。...7.3 链接顺序 在使用静态库时,链接的顺序可能会影响最终的链接结果。通常,链接器会按顺序扫描库文件,因此被依赖的库应放在依赖它们的库之后,否则可能出现未定义引用的问题。 8....链接器的详细工作机制 9.1 符号解析与重定位表 在链接阶段,链接器需要解决符号的定义和引用之间的关系。符号是程序中函数、变量等的名字,它们在编译阶段可能并没有具体的内存地址。

    11610

    《程序员的自我修养》第三章学习笔记

    4,ELF文件类型:分为 可重定位、可执行、共享目标文件、核心转储文件 3.4.2 段表(除了文件头以外最重要的结构) 1,描述了ELF各个段的信息(比如每个段的段名、段的长度、在文件中的偏移,读写权限及其他属性...3.4.3 重定位表 1,一个叫”rel.text”的段,类型是”SHT_REL”,就是重定位表 2,链接器在处理目标文件时,需要对目标文件中的某些部位进行重定位(即代码段和数据段中那些对绝对地址的引用的位置...3,这些重定位信息都记录在ELF文件的重定位表里。对于每个需要重定位的代码段或数据段,都会有一个相应的重定位表。...3,强弱符号都是针对定义来说的,不是针对符号的引用。 假如 extern int ext; ext不是强符号也不是弱符号,因为它是一个外部变量的引用。...5,弱引用与强引用: 强引用:假如链接时没找到该符号的定义,链接器就会报符号未定义错误。 弱引用:假如链接时没找到该符号的定义,链接器不会报错,默认其为0或是一个特殊值。

    1.2K60
    领券