gcc共享库无法链接到glibc

时间:2014-01-19 23:33:07

标签: c gcc linker

我正在Linux 64bit下使用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是目标共享库名。

任何人都可以解释为什么会这样吗?

感谢。

1 个答案:

答案 0 :(得分:11)

x86_64架构gcc要求您默认使用-fPIC,即位置独立代码。

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

但目前的架构属于x86_64类型,这意味着它可以位于64bit地址空间内的任何位置。

因此动态链接器实际上无法将符号链接到这样的重定位类型。

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

有关如何完成链接的详细信息,请参阅Eli Bendersky

这个精彩的博客