我有一些需要在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
答案 0 :(得分:3)
您希望强制NASM使用RIP相对寻址。做其中一个:
lea rax, [rel some_symbol_name]
或:
default rel
lea rax, [some_symbol_name]
如果这不起作用,请发布由NASM和GAS生成的机器代码。