【问题标题】:Position independent addressing in GNU assembler with Intel syntax [duplicate]使用 Intel 语法的 GNU 汇编器中的位置无关寻址 [重复]
【发布时间】:2013-11-14 17:41:06
【问题描述】:

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

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

leaq mystring(%rip), %rdi

Intel 语法是否有等价物?我似乎无法使用搜索引擎找到答案...

我实际上使用的是 noprefix 版本的 intel 语法,以防万一。

谢谢

【问题讨论】:

标签: assembly x86-64 gnu-assembler intel-syntax


【解决方案1】:

回答这个问题的一个简单方法是将指令汇编到一个目标文件中,然后用 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] —— 该指令不会对我要加载的数据进行编码。
  • 当然你不写0x0,你写你想要的符号。目的只是为了看看指令的语法是什么。
  • 你不能只指定符号,对吧?如果没有 PIE/PIC,我会写(例如)mov rdi, offset fmt,但如果你在 PIE 设置(-fpie -Wl,-pic)上构建它,那么汇编器会抱怨代码不是位置独立的:relocation R_X86_64_32S can not be used when making a shared object; recompile with -fPIC。我不是在构建共享对象,但这是你会得到的错误。另一方面,leaq mystring(%rip), %rdi(在 AT&T 中)生成 PIC 代码并为您计算偏移量。
  • 所以,除非我弄错了,否则我们仍然没有回答这个问题,我不确定如何理解上述内容。您能否以英特尔无前缀气体语法发布一个 hello world 程序,该程序(例如)以 PIC/PIE 兼容的方式从数据部分加载字符串“hello world”。这将大大澄清。
  • 我真的不明白这怎么不清楚。 Intel 语法中的leaq mystring(%rip), %rdilea rdi, [rip+mystring]。它们都将生成相对于 PC 的重定位。没有别的了。
猜你喜欢
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2019-07-16
相关资源
最近更新 更多