我有一些程序集需要在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
您想强制NASM使用RIP相对寻址。执行以下操作之一:
lea rax, [rel some_symbol_name]
或:
default rel
lea rax, [some_symbol_name]
如果不起作用,请张贴由NASM和GAS生成的机器代码。