作者:手机用户2502880331 | 来源:互联网 | 2024-10-22 18:01
我正在Linux64bit下使用EclipseCDT编写一个简单的C共享库。代码对的rand()函数有一个引用它编译得很好但是在链接时报告来自链接器的以下错误:gcc-shared
我正在Linux 64bit下使用Eclipse CDT编写一个简单的C共享库。
代码对
的rand()
函数有一个引用它编译得很好但是在链接时报告来自链接器的以下错误:
gcc -shared -o "libalg.so" ./sort.o /usr/bin/ld: ./sort.o: relocation R_X86_64_PC32 against undefined symbol `rand@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Bad value
sort.o是从文件编译的目标文件。 libalg.so是目标共享库名称。
谁能解释为什么会这样?
谢谢。
在x86_64
架构上, gcc
要求您默认使用-fPIC
即位置-fPIC
代码。
该错误的根本原因是符号rand
的重定位类型是R_X86_64_PC32
类型,这意味着它是PC相对的,并且应该位于与下一条指令相差32bit
。
但目前的架构是x86_64
类型,这意味着它可以位于64bit
地址空间内的任何位置。
因此,动态链接器实际上无法将符号链接到这样的重定位类型。
您必须使用-fPIC
或使用-mcmodel=large
编译代码,这实际上会使重定位类型为R_X86_64_64
。
有关链接如何完成的更多详细信息,请参阅Eli Bendersky撰写的这篇精彩博客
需要了解更多c/c++开发分享gcc共享库无法链接到glibc,也可以关注C/ C++技术分享栏目—编程笔记
以上就是c/c++开发分享gcc共享库无法链接到glibc相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(编程笔记)。