GNU链接器(ld)在共享库中生成静态重定位



如果我用编译底部的示例代码

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

最新更新