R_386_32共享库中的重定位

时间:2018-04-01 05:07:20

标签: gcc linker loader relocation

尝试了解在下面的情况下如何进行重定位 我有一个共享库libbigshr.so,它使用另一个共享库libfunlib.so。在后者中,我已经声明了这个全局变量foo。为了编译前者,我必须将前向声明做为 extern int foo

.rel.dyn at 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 at libfunlib.so

000005a5  00000901 R_386_32          00002010   foo

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

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

1 个答案:

答案 0 :(得分:1)

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