首页
学习
活动
专区
工具
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的问题,需要检查依赖库的链接、编译选项、符号定义和版本兼容性等方面的问题。具体的解决方法需要根据具体情况进行调试和排查。

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

相关·内容

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

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

1.2K30

Linux命令(63)——nm令

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

5K00
  • 《程序员自我修养》笔记

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

    9510

    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 方式来访问。...这些眼熟表名字实际上功能结构和静态链接那些表非常相似。最大区别就是目标文件定位是在静态链接完成,共享对象定位是在装载完成。 值得提出是可执行文件也可以编译为共享对象形式。

    96631

    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.5K13

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

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

    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函数地址只能回写到数据段内,而不能回写到代码段上。 注意:刚才谈到回写,是指运行时修改,更专业称谓应该是运行时定位,与之相对应还有链接定位

    89410

    体系结构复习笔记

    链接器 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

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

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

    12410

    动态链接步骤与实现

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

    1.4K20

    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

    关于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.3K20

    动态链接相关结构

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

    1.7K20

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

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

    10810

    程序编译、链接、装载与运行

    上面的操作都是针对目标文件a.o进行,我们对目标文件b.o执行以上命令可以发现其既不存在数据段定位表,也不存在代码段定位表。...而a.c中则不一样,因为在a.c中变量shared和函数swap都没有定义在当前文件中,因此编译后产生目标文件中不存在它们地址信息,所以编译器需要把它们放在定位表中,等到链接再到其它目标文件中找到对应符号信息之后对其进行定位...,T 表示该符号是指令,U 代表该符号未定义。...从上面的结果我们可以看到,链接过程确实是对目标文件符号做了“粘合”操作。 问:定位表和符号表之间是什么关系?...答:它们之间是相互合作关系,链接器首先要根据定位表找到该目标文件中需要被定位符号,之后再根据符号表去其它目标文件中找到可以相匹配符号,最后对本目标文件中符号进行定位

    1.3K10
    领券