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

Linker GNU链接器(ld)在共享库中生成静态重定位,linker,gnu,ld,relocation,Linker,Gnu,Ld,Relocation,如果我用 arm-elf-gcc init.c -o lib.so -Wl,-shared -nostdlib 我得到了一个带有一些重定位的共享库(readelf lib.so-r): 到目前为止,我认为链接器解决了所有静态重定位,并在必要时生成动态重定位(由加载程序处理)。 为什么链接器输出中会留下静态重定位? 文件说,R_ARM_ABS32是一个静态的重新定位,并且: 静态重定位由静态链接器处理;他们通常是 完全解析或用于为 通过后期链接步骤或动态加载程序进行处理。结构合理的 创建静态链接

如果我用

arm-elf-gcc init.c -o lib.so -Wl,-shared -nostdlib
我得到了一个带有一些重定位的共享库(readelf lib.so-r):

到目前为止,我认为链接器解决了所有静态重定位,并在必要时生成动态重定位(由加载程序处理)。 为什么链接器输出中会留下静态重定位? 文件说,R_ARM_ABS32是一个静态的重新定位,并且:

静态重定位由静态链接器处理;他们通常是 完全解析或用于为 通过后期链接步骤或动态加载程序进行处理。结构合理的 创建静态链接后,图像将没有静态重新定位 完成,因此post链接器或动态加载程序通常只需要 处理动态迁移

顺便说一句,这也可以用i386 elf gcc复制,那里使用的静态重定位是R_386_32

有谁能告诉我,为什么,并告诉我,哪些重新安置应该真正处理的装载机? 提前谢谢

示例代码:

extern unsigned char lpv1;
extern unsigned char lpv2;

unsigned char* plpv1 = &lpv1;

void func(void)
{
    lpv2 = *plpv1;
}
谁能告诉我,为什么


很可能是因为您在编译时缺少了
-fPIC
标志。

邮件列表上有一个后续操作:

使用-fPIC会稍微更改重新定位,但即使这样,库中仍会保留一个静态重新定位(R\u ARM\u ABS32)。还有其他建议吗?这里的问题也是一样。。。有进展吗?
extern unsigned char lpv1;
extern unsigned char lpv2;

unsigned char* plpv1 = &lpv1;

void func(void)
{
    lpv2 = *plpv1;
}