Независимая адресация в ассемблере 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
Другие вопросы по тегам