【发布时间】:2018-10-25 16:54:45
【问题描述】:
我正在尝试了解 ELF 中的重定位,但我在使用这方面的文档时遇到了一些问题,这相当神秘。例如,重定位方程描述了 3 个参数,S、A 和 P。现在我知道 A 只是加数,它是一些用于帮助重定位计算的数字,而 S 是 " 符号的值index 位于重定位条目中”(与函数名称相同,对吗?)但是 P 呢?手册将其描述为“被重新安置的存储单元的位置”,但这究竟意味着什么?
我刚刚找到一个例子来说明这一点:假设我们有 2 个目标文件,obj1.o 和 obj2.o。第一个引用了一个名为 foo() 的函数,该函数位于 obj2.o 中。
objdump -d obj1.o 产生:
Disassembly of section .text:
00000000 <func>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: e8 fc ff ff ff call 7 <func+0x7>
b: c9 leave
c: c3 ret
现在,readelf 表明这是一个 R_386_PC32 重定位,其方程为:S + A - P。
在组合这两个文件以生成完整的可执行文件重定位后,重定位条目显然已修补:
objdump -d relocated
test: file format elf32-i386
Disassembly of section .text:
080480d8 <func>:
80480d8: 55 push %ebp
80480d9: 89 e5 mov %esp,%ebp
80480db: 83 ec 08 sub $0x8,%esp
80480de: e8 05 00 00 00 call 80480e8 <foo>
80480e3: c9 leave
80480e4: c3 ret
80480e5: 90 nop
80480e6: 90 nop
80480e7: 90 nop
080480e8 <foo>:
80480e8: 55 push %ebp
80480e9: 89 e5 mov %esp,%ebp
80480eb: 5d pop %ebp
80480ec: c3 ret
看来链接器执行了以下计算:S + A – P: 0x80480e8 + 0xfffffffc – 0x80480df
我的问题是:
- P 的值从何而来?
- 加数有什么意义?
【问题讨论】: