Mat*_*man 3 macos assembly x86-64 nasm
我有一些程序集需要在 OS X (x86-64) 中加载 C 符号。使用 x86,您执行此操作的方式是:
mov rax, some_symbol_name
Run Code Online (Sandbox Code Playgroud)
但是,对于 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
Run Code Online (Sandbox Code Playgroud)
我真的被这个(看似)简单的问题难住了。我已经查看了 GAS 反汇编,它似乎正在按照上述方式做一些事情lea
,但是我无法让 NASM 生成正确的代码。
编辑:作为参考,这是由 GAS 生成的汇编代码:
leaq some_symbol_name(%rip), %rax
Run Code Online (Sandbox Code Playgroud)
小智 6
您想强制 NASM 使用 RIP 相对寻址。执行以下操作之一:
lea rax, [rel some_symbol_name]
Run Code Online (Sandbox Code Playgroud)
或者:
default rel
lea rax, [some_symbol_name]
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,请发布 NASM 和 GAS 生成的机器代码。
归档时间: |
|
查看次数: |
1634 次 |
最近记录: |