在 x86-64 上,当使用带有intel 语法的 GNU 汇编器时,如何以与位置无关的方式(PIC 和 PIE 兼容)从 .data 部分加载地址。
例如,使用 AT&T 语法,您可以这样做:
leaq mystring(%rip), %rdi
英特尔语法是否有等价物?我似乎无法使用搜索引擎找到答案...
我实际上正在使用noprefix
英特尔语法的版本,以防万一。
谢谢
在 x86-64 上,当使用带有intel 语法的 GNU 汇编器时,如何以与位置无关的方式(PIC 和 PIE 兼容)从 .data 部分加载地址。
例如,使用 AT&T 语法,您可以这样做:
leaq mystring(%rip), %rdi
英特尔语法是否有等价物?我似乎无法使用搜索引擎找到答案...
我实际上正在使用noprefix
英特尔语法的版本,以防万一。
谢谢
回答这个问题的一个简单方法是将指令汇编到一个目标文件中,然后用 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