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