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

创建共享对象时不能使用针对`_nc_globals的重定位R_X86_64_32;在安装readline时使用-fPIC重新编译

创建共享对象时不能使用针对_nc_globals的重定位R_X86_64_32是一个错误信息,它通常出现在编译或链接共享对象时。这个错误表明在编译或链接过程中,使用了不兼容的重定位类型。

具体来说,_nc_globals是ncurses库中的一个全局变量,而R_X86_64_32是一种特定的重定位类型,用于32位x86_64架构的目标文件。这个错误的原因可能是在编译或链接过程中,尝试将32位的重定位类型应用于64位的目标文件。

解决这个错误的方法是重新编译安装readline库,并使用-fPIC选项来生成位置无关代码(Position Independent Code)。位置无关代码是一种可以在内存中的任何位置加载和执行的代码,它不依赖于特定的内存地址。这样可以避免在共享对象中使用不兼容的重定位类型。

以下是一个示例的解决方案:

  1. 下载readline源代码,并解压缩。
  2. 进入解压后的readline目录。
  3. 执行以下命令重新配置编译选项:
  4. 执行以下命令重新配置编译选项:
  5. 这将使用-fPIC选项重新配置编译选项。
  6. 执行以下命令进行编译和安装:
  7. 执行以下命令进行编译和安装:
  8. 这将重新编译readline库,并将其安装到系统中。
  9. 在编译或链接其他共享对象时,确保不再出现_nc_globals的重定位R_X86_64_32错误。

需要注意的是,以上解决方案是基于假设问题出现在readline库的情况下。实际情况可能因具体环境和代码而异。如果问题仍然存在,建议查看编译或链接过程中的详细日志,以确定具体的错误原因,并采取相应的解决措施。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent Cloud Metaverse):https://cloud.tencent.com/solution/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

地址无关码

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

97320

cmake:动态链接库(so)中静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++

使用这种方案,我so库代码不需要在编译链接tcmalloc,什么都不用改变,就能使用tcmalloc。...但是凡事有利就有弊,这个方案带成本就是系统安装、维护稍显复杂:需要在服务器上安装tcmalloc和libunwind(应用系统运行在64位操作系统下),还可能需要修改tomcat启动脚本以加入LD_PRELOAD...-shared》),解决这个问题方法也大同小异,就是根据这个错误提示用-fPIC参数重新编译相关库,这里是就是指要重新编译tcmalloc。...于是就用网上介绍办法,重新编译tcmalloc,gperftools2.4源代码目录下执行: ....总结 如果在可执行程序中静态链接tcmalloc,用默认参数编译tcmalloc就好了,无需带-fPIC参数, 但是动态库(so)中静态链接tcmalloc,必须要用-fPIC重新编译tcmalloc

1.9K10

Linux静态库和共享库详解及实例

简单来说,就相当于一个仓库,把你已经写好功能函数放到库中,然后后续需要通过正确接口去使用相应功能,当然可以把库分享给别人也很方便。...,那么程序就需要重新编译会有些麻烦。        ...主版本号增加就说明了它是不兼容,需要重新编译链接。...首先我们要对.cpp文件进行编译,那么-fPIC这个命令此时就不能少,表示编译文件与路径无关,也就是说生成文件都是相对路径,而不是绝对路径,如果使用绝对路径,那么多个进程共享使用这个库时候,会根据这个代码段引用数据对象需要定位..., 定位会修改代码段内容,这就造成每个使用这个.so文件代码段进程在内核里都会生成这个.so文件代码段copy,那么就相当于每个进程都维护了一个自己.so副本,因此就做不到共享了。

3.3K20

动态链接步骤与实现

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

1.3K20

Linux共享库、静态库、动态库详解

一个“程序函数库”简单说就是一个文件包含了一些编译代码和数据,这些编译代码和数据可以事后供其他程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。...静态库函数允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码时间。不过,今天这么快速计算机面前,一般程序重新编译也花费不了多少时间,所以这个优势已经不是像它以前那么明显了。...共享函数库 共享函数库中函数是在当一个可执行程序启动时候被加载。如果一个共享函数库正常安装,所有的程序重新运行时候都可以自动加载最新函数库中函数。...首先,使用gcc -fPIC或-fpic标志创建将进入共享对象文件。-fPIC和-fpic选项可以实现“位置独立代码”生成,这是共享一个要求; 见下文差异。...使用-fpic选项通常会生成更小更快代码,但会有平台相关限制,例如全局可见符号数量或代码大小。链接器将告诉您,创建共享是否适合。如果有疑问,我选择-fPIC,因为它总是有效。

8.8K10

linux动态库和静态库使用_静态库使用

认识动静态库 Linux下创建文件编写以下代码,并生成可执行程序。...如果不加-fPIC选项,则加载.so文件代码段,代码段引用数据对象需要定位定位会修改代码段内容,这就造成每个使用这个.so文件代码段进程在内核里都会生成这个.so文件代码段拷贝,并且每个拷贝都不一样...不加-fPIC编译出来.so是要在加载根据加载到位置再次定位,因为它里面的代码BBS位置无关代码。...如果该.so文件被多个应用程序共同使用,那么它们必须每个程序维护一份.so代码副本(因为.so被每个程序加载位置都不同,显然这些定位代码也不同,当然不能共享)。...我们总是用-fPIC来生成.so,但从来不用-fPIC来生成.a。但是.so一样可以不用-fPIC选项进行编译,只是这样.so必须要在加载到用户程序地址空间重定向所有表目。

4.7K20

含大量图文解析及例程 | Linux下ELF文件、链接、加载与库(中)

可执行文件程序头表 我们用readelf -h [fileName]命令查看一个可执行ELF文件ELF头,会发现与可定位ELF文件ELF头有一个重大不同:可定位文件ELF头中 Start of...-o libvector.so addvec.c multvec.c 其中-fpic选项告诉编译器生成位置无关代码(PIC),而-shared选项告诉编译器生成共享库。...关键技术 之前静态链接过程中我们提到过重定位过程,那个时候其实属于链接定位,现在我们需要装载定位 ,主要使用了以下关键技术: PIC位置无关代码 GOT全局偏移表 GOT配合PLT实现延迟绑定技术...动态链接器本身也是.so文件,但是它比较特殊,它是静态链接。本身不依赖任何其他共享对象不能使用全局和静态变量。这是合理,试想,如果动态链接器都是动态链接的话,那么由谁来完成它动态链接呢?...动态链接过程图示 动态链接库构建与使用 创建自己动态链接库 创建号一个动态链接库(如我们libvector.so)之后,我们肯定不可能只在当前目录下使用它,那样他就不能被叫做 ”库“了。

2.6K21

CC++常见gcc编译链接错误解决方法

库文件找不到:ld: cannot find -lACE 6) GCC编译遇到如下错误,可能是因为在编译没有指定-fPIC,记住:-fPIC即是编译参数,也是链接参数 relocation...,该共享库依赖一静态库编译没有加“-fPIC”参数,解决方法为带“-fPIC重新编译被依赖静态库 relocation R_X86_64_32 against `a local symbol'...17) 下面这个编译错误,可能是因为全局域内调用一个类对象成员函数,全局域内是不能直接执行函: error: expected constructor, destructor, or type...=/usr,是有区别的,前者赋值不能通过环境变量覆盖,后者则可以使用环境变量值覆盖。...为解决这个问题,可以禁止编译32位版本,configure带上参数--disable-multilib,或者安装32位版本glibc。

7.7K30

【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

如果只有lib文件,那么这个lib文件是静态编译出来,索引和实现都在其中。静态编译lib文件有好处:给用户安装就不需要再挂动态库了。...Linux下,共享加载是由/lib/ld.so完成,ld.so加载共享,会从ld.so.cache查找。 创建函数库示例 我们通常把一些公用函数制作成函数库,供其它程序使用。...在生成动态库,需要使用-fPIC,这样才能生成位置无关代码,达到代码段和数据段共享目的。...如果不加fPIC,则编译出来代码加载需要根据加载到位置进行定位(因为它里面的代码并不是位置无关代码),如果被多个应用程序共同使用,那么它们必须每个程序维护一份so代码副本了。...(因为so被每个程序加载位置都不同,显然这些定位代码也不同,当然不能共享)。

4.3K52

Linux编译相关命令

/include/a.h -I- DirPath 就是取消前一个参数功能,所以一般-I DirPath之后使用 (3)-L LibPath...-shared hello.cpp -o libmyhello.so (5)使用动态库 动态库时候和静态库使用一样,唯一值得注意是当目录中同时存在相同名称动态库和静态库...,编译时候优先使用动态库 2、fPIC选项 加上fPIC选项生成动态库位置无关,可以实现多个进程共享动态库,多个进程引用同一个PIC动态库,可以共享内存。...这一个库不同进程中虚拟地址不同,但操作系统显然会把它们映射到同一块物理内存上。...不加fPIC,则加载so文件,需要对代码段引用数据对象需要定位定位会修改代码段内容,这就造成每个使用这个.so文件代码段进程在内核里都会生成这个.so文件代码段copy.每个copy都不一样

3.3K00

my linux FAQ

./" 这个命令网上资料说是解压到本目录 经试验不可用 创建文件命令  touch filename Windows和linux换行符不一致问题  Linux 下换行是 \n ,而在 Windows...反向命令是 CTRL-B。 vi删除多行 : ndd 删除以当前行开始n行 linux中删除大量文件,直接用rm会出现:-bash: /bin/rm: 参数列表过长,错误。 ...ctags gcc,gcc最好使用pkg版(我是lion os),用tar包装各种问题  并且必须是with python编译才有自动补全功能  mvim ctags安装后需要设置到vimrc中,...+=['-fPIC'] ,无果, 重新安装了zlib 设置  extra_link_args+=['--with-zlib-dir=/usr/zlib'] 也无果, 最终发现是因为首先使用了mysql集成...zlib,会覆盖后边选项,直接安装到/home/work/mysql/lib/mysql 中 ,再执行编译安装,终于成功。

1.4K30

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

.html(Linux上制作可执行共享库示例) 问1:如果测试中全局变量global_var是个带构造和析构对象,会如何?...(答案最后) 问2:如果使用-fPIE替代-fPIC编译链接,会是什么结果了?...原因是使用dlopen动态加载共享,如果静态库中包含有全局变量,可能会出现名同地址不同全局变量。 解决办法:总是使用RTLD_GLOBAL加载共享库,而不是RTLD_LOCAL。...比如程序公司名、发布版本号等 .line 调试行号表,即源代码行号与编译后指令对应表 .hash 符号哈希表 .dynamic 动态链接信息 .debug 调试信息 .comment...表示不丢弃未定义符号和需要定位符号 --export-dynamic 创建一个动态连接可执行程序时, 把所有的符号加到动态符号表中

2.6K50

Linux编译工具:gcc入门

汇编器生成是可定位目标文件,学过操作系统,我们知道,源程序中地址是从0开始,这是一个相对地址,而程序真正在内存中运行时地址肯定不是从0开始,而且在编写源代码时候也不能知道程序绝对地址,...所以定位能够将源代码代码、变量等定位为内存具体地址。...hello.c 或 gcc -c hello.c -o hello.o 编译生成可定位目标文件 使用gcc可以加上-Wall选项。...-c hello.c -o hello.o gcc -Wall main.o hello.o -o main 独立编译好处是,当其中某个模块发送改变,只需要编译该模块就行,不必重新编译所有文件...-lhello 该命令与使用静态库命令相同,但是共享库与静态库共存情况下,优先使用共享库。

4.7K50

ffmpeg安装失败_linux离线安装ffmpeg

也可以libass编译出错信息中看到依赖哪个库没有找到,重新编译这个库就可以。...opencv时候报libvpx没有使用-fPIC编译 Compilation fails with “relocation R_X86_64_32 against `.rodata.str1.8...但是,我为了保险起见,编译 Ffmpeg 使用单独下载源码。 通过事先了解或在二者源码树下面执行 ....h263 视频部分,但如果不重新指定相关参数, #转换成视频文件会出现“[h263 @ 0x14f81c0]warning: first frame is no #keyframe”问题,从而导致定位视频出现花屏现象...重新指定视频编码详细参数 intermkv2.sh 比直接使用 -vcodec copy intermkv3.sh 慢 10 秒,但是直接使用 -vcodec copy 会出现缺失关键帧错误导致定位花屏

6.3K20

数据库PostrageSQL-从源代码安装

默认从源码安装Python不是这样, 而是很多操作系统发布中有一个共享库可用。如果选择了编译PL/Python但找不到一个共享 libpython,configure将 会失败。...这可能意味着你不得不安装额外包或者(部分)编译 Python安装以提供这个共享库。 在从源码编译,请用–enable-shared标志运行 Python配置脚本。...不过,如果你把这些设置保留默认,那么安装将是可定位,意思是你可以安装过后移动目录(man和doc位置不受此影响)。...对于可定位安装,你可能需要使用configure–disable-rpath选项。 还有,你需要告诉操作系统如何找到共享库。...但是,非零优化级别会使调试更复杂,因为在编译代码中步进通常将不能和源代码行一一对应。如果你尝试调试优化过代码觉得困惑,将感兴趣特定文件使用-O0编译

4.1K40

ELF文件及android hook原理

比如”.rel.text”就是针对”.text”定位表,”.rel.data”就是针对”.data”定位表。...符号解析与定位 编译将”a.c”编译成指令,它如何访问”shared”变量?如何调用”swap”函数?...与普通程序不同是,动态链接模块装载地址是从地址0x00000000开始,这个地址是无效共享对象最终装载地址在编译时时不确定,而是在装载,装载器根据当前地址空间空前情况,动态分配一块足够大小虚拟地址空间给相应共享对象...我们还需要有一种更好方法解决共享对象指令中对绝对地址定位问题。....dynamic段 这个段里保存了动态链接器所需要基本信息,比如依赖哪些共享对象、动态链接符号表位置、动态链接定位位置、共享对象初始化代码地址等。

3.7K81

吴章金: 如何创建一个*可执行*共享

license: "cc-by-nc-nd-4.0" description: "本文手把手指导如何创建一个可以执行共享目标文件" 前言 前段时间,有多位同学“泰晓原创团队”微信群聊到 C 语言相关两个问题...先来看看两类文件区别 当前 Linux 下面的二进制程序标准格式是 ELF,这类格式可以用来表示 4 种不同类型文件: 可定位目标文件(.o),用于静态链接 可执行文件格式,用于运行时创建进程映像...可执行文件有标准 C 语言程序执行入口 main,而共享库则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址链接是相对,在装载动态分配和计算符号地址 接下来做个实验具体看看两者区别.../hello.noc hello 通过实验,可以确认“正常”创建出来共享库并不能够直接运行,而是需要链接到其他可执行文件中。...\n"); } 当普通共享使用,默认编译即可,要能够执行的话,实现一下 entry(),编译打开 EXEC_SHARED 即可: $ gcc -m32 -shared -fpic -o libhello.so

1.1K20

服务器架设笔记——编译Apache及其插件

使用回车确认选择,这样将自动安装相关软件——包括Apache。待安装完毕,使用service httpd start方式启动http服务。这样我便可以实体机上使用ip访问该服务了。        ...Ubuntu系统中好像已经带了openssl库文件。但是我们在编写插件,会使用到它头文件,所以我们也把它拉取和编译下。...openssl库编译有些特别,因为如果不这么做,之后编译apache mod_ssl模块是会报“libssl.a(s3_srvr.o): relocation R_X86_64_32 against...但是事情总不能一帆风顺,我运行可执行文件httpd,会报libpcre.so.1(64位系统好像是报libpcre.so.0)找不到(使用lld httpd查看文件关联)。...至此,我们编译Apache跑起来了。编译插件环境也准备就绪。 编译、添加插件         Apache编译./bin目录下,有个axps文件。

1.2K20
领券