【问题标题】:why cannot use R_X86_64_PC32 with shared libs为什么不能将 R_X86_64_PC32 与共享库一起使用
【发布时间】:2021-02-06 18:16:54
【问题描述】:

似乎无法使用 R_X86_64_PC32 引用从可重定位对象构建共享库,我不明白为什么。

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

relocation R_X86_64_PC32 against symbol `infolib' can not be used when making a shared object; recompile with -fPIC

【问题讨论】:

    标签: linker shared-libraries x86-64 elf


    【解决方案1】:

    正如这里所说:Difference in position-independent code: x86 vs x86-64

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

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

    【讨论】:

    • 或者你可以让你的内部符号引用使用“隐藏的”ELF可见性,这样它们就可以避免符号插入并且可以使用普通的call rel32函数和RIP-私有静态数据的相对寻址(C static 关键字,而不是全局变量)。您可以为全局符号创建“隐藏”别名,以便您可以有效地在库中运行; glibc 在它自己的源代码中做到了这一点。 (通常带有weakref 属性)
    • IIRC,GCC 有一个选项可以使默认符号可见性“隐藏”,因此您必须手动标记要从共享库中“导出”的全局变量和函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2016-02-22
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多