我注意到使用-r
看来,进行部分链接实际上并不能解决任何重定位问题,即使它们可以通过相对寻址来解决。例如,考虑f.o
and g.o
, with f.o
含有f()
哪个调用g()
within g.o
。链接之前,拆卸和重定位均符合预期。部分链接到新文件后h.o
(via ld -r -o h.o f.o g.o
),但是,调用仍然需要重新定位g()
,尽管理论上它可以通过相对地址来解决。
这是拆解h.o
(objdump -d h.o
),包含f()
and g()
。您可以看到调用g()
仍未解决:
h.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <f>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: e8 00 00 00 00 callq 9 <f+0x9>
9: 90 nop
a: 5d pop %rbp
b: c3 retq
000000000000000c <g>:
c: 55 push %rbp
d: 48 89 e5 mov %rsp,%rbp
10: 90 nop
11: 5d pop %rbp
12: c3 retq
这是搬迁表h.o
(objdump -r h.o
):
h.o: file format elf64-x86-64
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000000000005 R_X86_64_PC32 g-0x0000000000000004
RELOCATION RECORDS FOR [.eh_frame]:
OFFSET TYPE VALUE
0000000000000020 R_X86_64_PC32 .text
0000000000000058 R_X86_64_PC32 .text+0x000000000000000c
因此,只是想知道是否有任何方法可以强制在部分链接期间通过相对地址执行重定位。我尝试用以下命令编译代码-fpic
,但这仍然没有导致在部分链接期间执行重定位。
请注意,我这样做没有任何目标、应用或理由。只是探索功能和能力ld
.
Per 这个参考看起来相对符号没有被解析的原因是为了给链接更多的灵活性。如果我们想解析符号g
到不同的地址,我们需要更改代码中的这些跳转。
但是,如果您更改符号g
是静态的,那么链接器将解析跳转。在这种情况下,该符号不再被导出,因此未来的链接器调用无法操作该符号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)