【问题标题】:R_386_32 Relocations in shared libraryR_386_32 共享库中的重定位
【发布时间】:2018-04-01 05:07:20
【问题描述】:

试图了解在以下情况下搬迁是如何发生的 我有一个共享库 libbigshr.so,它使用另一个共享库 libfunlib.so。在后者中,我声明了这个全局变量 foo。要编译前者,我必须将前向声明为 extern int foo

.rel.dyn 在 libbigshr.so

Offset     Info    Type            Sym.Value  Sym. Name

000005a5  00000401 R_386_32          00000000   foo
000005ab  00000401 R_386_32          00000000   foo
000005c7  00000401 R_386_32          00000000   foo

.rel.dyn 在 libfunlib.so

000005a5  00000901 R_386_32          00002010   foo

在 libfunlib 中,平移偏移量是正确的值 (0x2010),因此我没有问题。但想知道如何在 libbigshr 中插入正确的地址。我可以理解,一旦为变量分配了内存并确定了它的位置,就可以在其他任何地方使用相同的变量。但我对这样做的过程很感兴趣。

由于我的无知,我的问题可能没有足够的数据来回答 - 所以请告诉我,我会提供更多细节。

【问题讨论】:

    标签: gcc linker loader relocation


    【解决方案1】:

    正确的地址是由动态链接器在运行时通过重定位处理生成的。例如,在 glibc 中,R_386_32 在文件 sysdeps/i386/dl-machine.h 中的 elf_machine_rel 函数的 i386 版本中处理。 glibc wiki 有一个overview of process startup。有关详细信息,请参阅Linux Standard Base 中的参考资料,特别是有关System V Application Binary Interface 的参考资料。对于特定于机器的信息,H.J. Lu 维护了一组x86 ABI documents

    【讨论】:

    • 同意。我在 gdb 中为 libfunlib.so 计算并验证了这一点。但想对其他图书馆了解同样的情况。感谢和 +1 的指点。需要更多帮助才能理解其余部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2021-05-23
    • 2014-05-06
    • 2011-06-15
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多