Разрешить относительные перемещения в частичной связи

Я заметил, что с помощью -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,

1 ответ

По этой ссылке похоже, что причина того, что относительные символы не разрешены, состоит в том, чтобы дать связанной гибкости больше Если бы мы хотели вместо этого разрешить символ g на другой адрес, нам нужно изменить эти переходы в коде.

Однако, если вы измените свой символ g чтобы быть статичным, то компоновщик будет разрешать прыжки. В этом случае символ больше не экспортируется и, следовательно, не может быть обработан будущими вызовами компоновщика.

Другие вопросы по тегам