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

时间:2013-07-24 14:35:11

标签: linker gnu ld relocation

如果我用

编译底部的示例代码
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

直到现在我相信,链接器会解析所有静态重定位并生成动态重定位(由加载器处理),这是必要的。 为什么链接器输出中还有静态重定位? This文档说,R_ARM_ABS32是静态重定位,也是:

  

静态重定位由静态链接器处理;他们通常是   完全解决或用于生成动态重定位   通过后链接步骤或动态加载器进行处理。形成良好   静态链接后,image将没有静态重定位   完成,因此后链接器或动态加载器通常只需要   处理动态迁移。

BTW,这也可以使用i386-elf-gcc重现,其中使用的静态重定位是R_386_32。

任何人都可以告诉我,为什么并告诉我,哪些重定位应该在装载程序中真正处理? 提前谢谢!

示例代码:

extern unsigned char lpv1;
extern unsigned char lpv2;

unsigned char* plpv1 = &lpv1;

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

2 个答案:

答案 0 :(得分:0)

  

任何人都可以告诉我,为什么

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

答案 1 :(得分:0)