【问题标题】:Load the address of a symbol using NASM?使用 NASM 加载符号的地址?
【发布时间】:2012-02-02 01:50:19
【问题描述】:

我有一些程序集需要在 OS X (x86-64) 中加载 C 符号。使用 x86,您可以这样做:

mov rax, some_symbol_name

但是,对于 x86-64,这会导致链接警告:

ld:警告:PIE 已禁用。代码签名的 PIE 中不允许使用绝对寻址(可能是 -mdynamic-no-pic),但在 Test2.o 的 _main 中使用。
要修复此警告,请勿使用 -mdynamic-no-pic 编译或使用 -Wl,-no_pie 链接

注意:我知道 PIE 是什么,我不想禁用它。以下是我将符号地址加载到寄存器中的其他一些尝试:

movq rax, some_symbol_name          ; Link warning
lea rax, [rel some_symbol_name]     ; No link warning, but doesn't always get correct address

我真的被这个(看似)简单的问题难住了。我查看了 GAS 反汇编,它似乎在按照上面的 lea 做一些事情,但我无法让 NASM 生成正确的代码。

编辑:供参考,这是 GAS 生成的汇编代码:

leaq    some_symbol_name(%rip), %rax

【问题讨论】:

标签: macos assembly x86-64 nasm


【解决方案1】:

您想强制 NASM 使用 RIP 相对寻址。执行以下操作之一:

lea rax, [rel some_symbol_name]

或:

default rel
lea rax, [some_symbol_name]

如果这不起作用,请发布 NASM 和 GAS 生成的机器代码。

【讨论】:

  • 我已经尝试了这两个选项,但它们有时会导致计算的地址不正确。这应该是正确的解决方案,但我认为 OS X 版本的 NASM for x86-64 中存在错误。
  • @MattFichman:确实,OS X 上存在一个影响 RIP 相对寻址的 NASM 2.11.08 错误:NASM issue on OSX 64-bit
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多