Linker 为什么不能将R_X86_64_PC32与共享库一起使用

Linker 为什么不能将R_X86_64_PC32与共享库一起使用,linker,shared-libraries,x86-64,elf,Linker,Shared Libraries,X86 64,Elf,似乎不可能从具有R\u X86\u 64\u PC32引用的可撤销对象构建共享库,我不明白为什么 这些参考是IP相对的,因此与位置无关。那么,为什么我告诉我情况并非如此,我必须使用生成GOT引用的-fPIC relocation R_X86_64_PC32 against symbol `infolib' can not be used when making a shared object; recompile with -fPIC 正如这里所说: IP相对偏移量不适用于共享库,因为全局符号

似乎不可能从具有
R\u X86\u 64\u PC32
引用的可撤销对象构建共享库,我不明白为什么

这些参考是IP相对的,因此与位置无关。那么,为什么我告诉我情况并非如此,我必须使用生成GOT引用的
-fPIC

relocation R_X86_64_PC32 against symbol `infolib' can not be used when making a shared object; recompile with -fPIC
正如这里所说:

IP相对偏移量不适用于共享库,因为全局符号可以被覆盖,所以x86-64在不使用PIC构建时会发生故障


我们必须使用-fPIC检查在运行时更新的GOT以进行符号覆盖。

或者您可以使您的内部符号引用使用“隐藏”ELF可见性,这样它们就可以免受符号插入的影响,并且可以对函数使用普通的
调用rel32
,对私有静态数据使用RIP相对寻址(C
static
关键字,与全局符号相反)。您可以为全局符号创建“隐藏”别名,以便高效地在库中运行函数;glibc在其自己的源代码中实现这一点。(通常带有
weakref
属性)IIRC、GCC有一个选项可以将默认符号可见性设置为“隐藏”,因此您必须手动标记要从共享库“导出”的全局变量和函数。