gcc共享库链接到glibc失败

Wudong

我正在使用Linux 64位下的Eclipse CDT编写一个简单的C共享库。

该代码在“代码”中对该rand()函数有一个引用<stdlib.h>它可以很好地编译,但是在链接时会报告来自链接器的以下错误:

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即位置无关代码。

该错误的根本原因是该符号的重定位类型rand是类型R_X86_64_PC32,这意味着它是与PC相关的,并且应位于32bit与以下指令的偏移量之内

但是当前的体系结构是x86_64类型,这意味着它可以位于64bit地址空间内的任何位置

因此,动态链接器实际上无法链接具有这种重定位类型的符号。

您必须使用-fPIC或编译代码,-mcmodel=large而这实际上会将重定位类型设置为R_X86_64_64

有关如何完成链接的更多详细信息,请参阅Eli Bendersky撰写的这个很棒的博客。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章