Linux 解决部分链接中的相对重新定位

Linux 解决部分链接中的相对重新定位,linux,ld,relocation,Linux,Ld,Relocation,我注意到,使用-r进行部分链接实际上并不能解决任何重定位问题,即使它们可以通过相对寻址来解决。例如,考虑 F.O.和 G.O.,包含 F.O.,包含()>代码> >代码> >代码> G.O.。在链接之前,拆卸和重新定位与预期一致。但是,在部分链接到一个新文件h.o(通过ld-r-o h.o f.o g.o)后,仍然会重新定位对g()的调用,尽管理论上它可以通过相对地址来解决 这里是h.o(objdump-dh.o)的反汇编,包含f()和g()。您可以看到对g()的调用仍然没有解决: h.o:

我注意到,使用
-r
进行部分链接实际上并不能解决任何重定位问题,即使它们可以通过相对寻址来解决。例如,考虑<代码> F.O.和 G.O.<代码>,包含<代码> F.O.<代码>,包含<代码>()>代码> >代码> >代码> G.O.<代码>。在链接之前,拆卸和重新定位与预期一致。但是,在部分链接到一个新文件
h.o
(通过
ld-r-o h.o f.o g.o
)后,仍然会重新定位对
g()
的调用,尽管理论上它可以通过相对地址来解决

这里是
h.o
objdump-dh.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
所以,我只是想知道在部分链接期间是否有任何方法可以强制通过相对地址执行重新定位。我尝试使用
-fpic
编译代码,但这仍然没有导致在部分链接期间执行重新定位

请注意,我对此没有目标、应用程序或理由。只要探索一下
ld

Per的功能和能力,就可以看出没有解析相关符号的原因是为了给链接提供更大的灵活性。如果我们想将符号
g
解析为不同的地址,我们需要更改代码中的跳转


但是,如果将符号
g
更改为静态,则链接器将解析跳转。在这种情况下,符号不再导出,因此将来的链接器调用无法操作。

我还了解到,
gcc
默认情况下也不会解析单个文件函数调用的重新定位:
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