加载符号的地址(nasm,64位OS X)

时间:2012-01-04 04:50:37

标签: macos x86-64 nasm

我有一些需要在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

1 个答案:

答案 0 :(得分:3)

您希望强制NASM使用RIP相对寻址。做其中一个:

lea rax, [rel some_symbol_name]

或:

default rel
lea rax, [some_symbol_name]

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