2012-01-04 43 views
2

我有一些程序集需要在OS X(x86-64)中加载C符号。随着86,你做到这一点的方法是:加载符号的地址(nasm,64位OS X)

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生成正确的代码。

编辑:作为参考,这是由气体产生的汇编代码:

leaq some_symbol_name(%rip), %rax 

回答

3

要强制NASM使用相对RIP处理。做一个:

lea rax, [rel some_symbol_name] 

或:

default rel 
lea rax, [some_symbol_name] 

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

+1

我已经尝试了这两个选项,并且它们有时会导致计算出错误的地址。这应该是正确的解决方案,但我认为x86-64的OS X版本的NASM存在一个错误。 – 2012-03-19 01:35:16