Assembly 采用Intel语法的GNU汇编程序中的位置无关寻址

Assembly 采用Intel语法的GNU汇编程序中的位置无关寻址,assembly,x86-64,gnu-assembler,intel-syntax,Assembly,X86 64,Gnu Assembler,Intel Syntax,在x86-64上,当使用带有英特尔语法的GNU汇编程序时,如何以位置无关的方式(PIC和饼图兼容)从.data节加载地址 例如,使用AT&T语法,可以执行以下操作: leaq mystring(%rip), %rdi 英特尔语法是否有一个等价物?我似乎无法用搜索引擎找到答案 我实际上使用的是英特尔语法的noprefix版本,以防万一这会有所不同 感谢回答这个问题的一个简单方法是将指令汇编成一个目标文件,然后用英特尔语法将其反汇编。您可以使用类似于objdump-d-Mintel test.o的

在x86-64上,当使用带有英特尔语法的GNU汇编程序时,如何以位置无关的方式(PIC和饼图兼容)从.data节加载地址

例如,使用AT&T语法,可以执行以下操作:

leaq mystring(%rip), %rdi
英特尔语法是否有一个等价物?我似乎无法用搜索引擎找到答案

我实际上使用的是英特尔语法的
noprefix
版本,以防万一这会有所不同


感谢

回答这个问题的一个简单方法是将指令汇编成一个目标文件,然后用英特尔语法将其反汇编。您可以使用类似于
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>
下面是反汇编(来自
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
0000000000000000:
0:48 8d 3d 00 lea rdi,[rip+0x0]#7
3:R_X86_64_PC32 mystring+0xFFFFFFFFFFFC

我不确定我是否遗漏了什么,但如果我想使用汇编程序(手工)编写x86-64代码,这是没有帮助的。我不能每次从.data加载数据时都加载[rip+0x0]——该指令不会对我要加载的数据段进行编码。当然,您不会写入
0x0
,而是写入您想要的符号。目的只是看看指令的语法是什么。但不能只指定符号,对吗?如果没有PIE/PIC,我会(例如)编写
mov rdi,offset fmt
,但是如果您在PIE设置(
-fpie-Wl,-PIC
)上构建它,那么汇编器会抱怨代码不是位置独立的:
在创建共享对象时不能使用重定位R_X86_64;使用-fPIC重新编译
。我不是在构建一个共享对象,但这是您将得到的错误。另一方面,
leaq mystring(%rip),%rdi
(在AT&T中)生成PIC代码并为您计算偏移量。我明白了。但是,这些都是完全相同的指令,只是用不同的语法打印出来:所以,还有一些事情正在发生。所以,除非我弄错了,否则我们仍然没有回答这个问题,我也不确定如何理解上面的内容。您是否可以发布一个Intel noprefix gas语法的hello world程序,该程序(例如)以PIC/PIE兼容的方式从数据部分加载字符串“hello world”。这将大大澄清。相关,请参阅
0000000000000000 <test>:
   0:   48 8d 3d 00 00 00 00    lea    rdi,[rip+0x0]        # 7 <test+0x7>
                        3: R_X86_64_PC32    mystring+0xfffffffffffffffc