Разрешить относительные перемещения в частичной связи
Я заметил, что с помощью -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
чтобы быть статичным, то компоновщик будет разрешать прыжки. В этом случае символ больше не экспортируется и, следовательно, не может быть обработан будущими вызовами компоновщика.