首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GNU (ld)在共享库中生成静态重定位。

GNU (ld)在共享库中生成静态重定位。
EN

Stack Overflow用户
提问于 2013-07-24 14:35:11
回答 2查看 1.4K关注 0票数 1

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

代码语言:javascript
运行
复制
arm-elf-gcc init.c -o lib.so -Wl,-shared -nostdlib

我得到了一个带有一些重定位的共享库(readelf lib.so -r):

代码语言:javascript
运行
复制
0000032c  00000d02 R_ARM_ABS32       000004b8   plpv1
00000330  00001302 R_ARM_ABS32       00000000   lpv2
000004b8  00000b02 R_ARM_ABS32       00000000   lpv1

到目前为止,我相信链接器解决了所有静态重定位,并生成动态重定位(将由加载程序处理),这是必要的。为什么链接器输出中仍然存在静态重定位?文档说,R_ARM_ABS32是一个静态重定位,并且:

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

顺便说一句,这也可以用i 386-精灵gcc复制,静态搬迁用的是R_386_32。

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

示例代码:

代码语言:javascript
运行
复制
extern unsigned char lpv1;
extern unsigned char lpv2;

unsigned char* plpv1 = &lpv1;

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

回答 2

Stack Overflow用户

发布于 2013-07-25 05:05:35

有人能告诉我,为什么

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

票数 0
EN

Stack Overflow用户

发布于 2015-05-06 10:44:02

有一个邮件列表的后续:bug.cgi?id=16163

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17837127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档