尝试了解在下面的情况下如何进行重定位
我有一个共享库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中插入正确的地址。我可以理解,一旦为变量分配了内存并确定了其位置,就可以在其他地方使用相同的内存。但我对这样做的过程很感兴趣。
由于我的无知,我的问题可能没有足够的数据来回答 - 所以请告诉我,我会提供更多细节。
答案 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。