我正在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
Run Code Online (Sandbox Code Playgroud)
sort.o是从文件编译的目标文件.libalg.so是目标共享库名称.
谁能解释为什么会这样?
谢谢.
abh*_*bhi 13
在x86_64
体系结构上gcc
要求您-fPIC
默认使用ie Position Independent Code.
该错误的根本原因是符号的重定位类型rand
是类型R_X86_64_PC32
,这意味着它是PC相对的并且应该位于32bit
与下一条指令的偏移量内.
但是当前的体系结构x86_64
类型意味着它可以位于64bit
地址空间中的任何位置.
因此,动态链接器实际上无法将符号与此类重定位类型链接.
您必须使用实际将重定位类型设置为的-fPIC
代码来使用或编译代码.-mcmodel=large
R_X86_64_64
有关链接如何完成的更多详细信息,请参阅Eli Bendersky撰写的这篇精彩博客
归档时间: |
|
查看次数: |
15444 次 |
最近记录: |