Независимая адресация в ассемблере GNU с синтаксисом Intel
На x86-64, как мне загрузить адрес из раздела.data позиционно-независимым способом (PIC и PIE-совместимый) при использовании ассемблера GNU с синтаксисом intel.
Например, используя синтаксис AT&T, вы можете сделать это:
leaq mystring(%rip), %rdi
Есть ли эквивалент для синтаксиса Intel? Я не могу найти ответ, используя поисковые системы...
Я на самом деле использую noprefix
версия синтаксиса Intel, в случае, если это имеет значение.
Спасибо
1 ответ
Простой способ ответить на этот вопрос - собрать инструкцию в объектный файл и разобрать ее в синтаксисе Intel. Вы можете использовать команду что-то вроде objdump -d -Mintel test.o
,
Делая это таким образом, мы получаем:
Disassembly of section .text:
0000000000000000 <test>:
0: 48 8d 3d 00 00 00 00 lea rdi,[rip+0x0] # 7 <test+0x7>
И это должно быть довольно ясно. Обратите внимание, что mystring
превратился в 0x0
: эти нули являются заполнителями байтов, которые будут скорректированы во время соединения, используя перемещение mystring
, В вашем источнике сборки вы бы использовали идентификатор.
Изменить: чтобы сделать это более понятным, вот пример исходного файла:
.intel_syntax noprefix
.globl test
test:
lea rdi, [rip+mystring]
А вот и разборка (от objdump -rd -Mintel test.o
). Обратите внимание на относительное перемещение ПК:
0000000000000000 <test>:
0: 48 8d 3d 00 00 00 00 lea rdi,[rip+0x0] # 7 <test+0x7>
3: R_X86_64_PC32 mystring+0xfffffffffffffffc