如果我用编译底部的示例代码
arm-elf-gcc init.c -o lib.so -Wl,-shared -nostdlib
我得到了一个带有一些重新定位的共享库(readelf-lib.so-r):
0000032c 00000d02 R_ARM_ABS32 000004b8 plpv1
00000330 00001302 R_ARM_ABS32 00000000 lpv2
000004b8 00000b02 R_ARM_ABS32 00000000 lpv1
到目前为止,我相信链接器解析所有静态重定位,并在必要时生成动态重定位(由加载程序处理)。为什么链接器输出中会留下静态重定位?该文件称,R_ARM_ABS32是一个静态重定位,也是:
静态重定位由静态链接器处理;它们是正常的完全解析或用于为通过后链接步骤或动态加载器进行处理。一个成型良好的静态链接完成后,图像将不会有静态重定位完整,因此后链接器或动态加载程序通常只需要处理动态搬迁。
顺便说一句,这也可以用i386elf-gcc来再现,那里使用的静态重定位是R_386_32。
有人能告诉我,为什么,并告诉我,哪些搬迁真正应该在加载器中处理吗?提前感谢!
示例代码:
extern unsigned char lpv1;
extern unsigned char lpv2;
unsigned char* plpv1 = &lpv1;
void func(void)
{
lpv2 = *plpv1;
}
有人能告诉我,为什么
很可能是因为在编译时缺少-fPIC
标志。
邮件列表中有以下内容:https://sourceware.org/bugzilla/show_bug.cgi?id=16163