3

在 x86-64 上,当使用带有intel 语法的 GNU 汇编器时,如何以与位置无关的方式(PIC 和 PIE 兼容)从 .data 部分加载地址。

例如,使用 AT&T 语法,您可以这样做:

leaq mystring(%rip), %rdi

英特尔语法是否有等价物?我似乎无法使用搜索引擎找到答案...

我实际上正在使用noprefix英特尔语法的版本,以防万一。

谢谢

4

1 回答 1

2

回答这个问题的一个简单方法是将指令汇编到一个目标文件中,然后用 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)。注意 PC 相对重定位:

0000000000000000 <test>:
   0:   48 8d 3d 00 00 00 00    lea    rdi,[rip+0x0]        # 7 <test+0x7>
                        3: R_X86_64_PC32    mystring+0xfffffffffffffffc
于 2013-11-14T18:39:13.990 回答