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