当在使用Intel语法的GNU汇编器时,在x86-64上如何以位置无关的方式(兼容PIC和PIE)从.data节加载地址。
例如,在使用AT&T语法时,您可以这样做:
leaq mystring(%rip), %rdi
是否有Intel语法的等效版本?我用搜索引擎找不到答案...
实际上,我正在使用Intel语法的版本,如果这有所区别。
谢谢
当在使用Intel语法的GNU汇编器时,在x86-64上如何以位置无关的方式(兼容PIC和PIE)从.data节加载地址。
例如,在使用AT&T语法时,您可以这样做:
leaq mystring(%rip), %rdi
是否有Intel语法的等效版本?我用搜索引擎找不到答案...
实际上,我正在使用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
0x0
,而是写你想要的符号。目的只是为了看指令的语法。 - gsgleaq mystring(%rip), %rdi
是lea rdi, [rip+mystring]
。它们都会生成一个PC相对重定位。没有其他的东西了。 - gsg