使用Intel语法的GNU汇编器中的位置无关寻址

3

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

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

leaq mystring(%rip), %rdi

是否有Intel语法的等效版本?我用搜索引擎找不到答案...

实际上,我正在使用Intel语法的版本,如果这有所区别。

谢谢


相关的,请参阅如何强制NASM使用位置无关变量? - jww
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

我不确定是否遗漏了什么,但如果我想使用汇编器手写x86-64代码,那并没有帮助。我不能每次想要从.data中加载某些内容时都加载[rip+0x0] -- 指令没有编码我想要加载哪个数据片段。 - Edd Barrett
当然,你不会写0x0,而是写你想要的符号。目的只是为了看指令的语法。 - gsg
@gsg 所以在英特尔语法中,“offset”关键字应该生成位置无关代码? - Edd Barrett
1
所以,除非我错了,我们仍然没有回答这个问题,而且我不太确定如何理解上面的内容。你能否发一份使用Intel noprefix gas语法的hello world程序,例如从数据段中以PIC/PIE兼容的方式加载字符串“hello world”。这将大大澄清问题。 - Edd Barrett
1
我真的不明白为什么这不清楚。在Intel语法中,leaq mystring(%rip), %rdilea rdi, [rip+mystring]。它们都会生成一个PC相对重定位。没有其他的东西了。 - gsg
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接