1

如果我在底部编译示例代码

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 是静态重定位,并且:

静态重定位由静态链接器处理;它们通常要么完全解析,要么用于生成动态重定位,以供后链接步骤或动态加载器处理。静态链接完成后,格式良好的图像将没有静态重定位,因此后链接器或动态加载器通常只需要处理动态重定位。

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

谁能告诉我,为什么并告诉我,哪些重定位应该在装载机中真正处理?提前致谢!

示例代码:

extern unsigned char lpv1;
extern unsigned char lpv2;

unsigned char* plpv1 = &lpv1;

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

2 回答 2

0

谁能告诉我,为什么

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

于 2013-07-25T05:05:35.263 回答
0

邮件列表上有后续跟进:https ://sourceware.org/bugzilla/show_bug.cgi?id=16163

于 2015-05-06T10:44:02.950 回答