使用NASM加载符号的地址吗?

问题描述 投票:3回答:1

我有一些程序集需要在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
macos assembly x86-64 nasm
1个回答
5
投票

您想强制NASM使用RIP相对寻址。执行以下操作之一:

lea rax, [rel some_symbol_name]

或:

default rel
lea rax, [some_symbol_name]

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

© www.soinside.com 2019 - 2024. All rights reserved.