繁体   English   中英

gcc共享库无法链接到glibc

[英]gcc shared library failed linking to glibc

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

代码对<stdlib.h>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即Position Independent Code。

该错误的根本原因是符号rand的重定位类型是R_X86_64_PC32类型,这意味着它是PC相对的,并且应该位于与下一条指令相差32bit范围内。

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

因此,动态链接器实际上无法将符号与此类重定位类型链接。

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

有关链接如何完成的更多详细信息,请参阅Eli Bendersky撰写的这篇精彩博客

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM