我注意到,使用-r
进行部分链接实际上并没有解决任何重定位问题,即使可以通过相对寻址来解决它们。例如,考虑f.o
和g.o
,其中f.o
包含f()
g()
g.o
。在链接之前,反汇编和重定位是预期的。但是,在部分链接到新文件h.o
(通过ld -r -o h.o f.o g.o
)之后,对g()
的调用仍然存在重定位,即使理论上它可以通过相对来解析地址。
以下是h.o
(objdump -d h.o
)的反汇编,其中包含f()
和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
。
答案 0 :(得分:0)
每this reference看起来没有解析相对符号的原因是为链接提供更大的灵活性。如果我们想要将符号g
解析为不同的地址,我们需要在代码中更改这些跳转。
但是,如果将符号g
更改为静态符号,则链接器将解析跳转。在这种情况下,符号不再导出,因此未来的链接器调用无法操作。