NASM 2.11.08 和 2.13.02+ 有错误macho64
输出。您所观察到的似乎是我最近在使用绝对引用时在 2.13.02+ 中看到的。最终链接的程序应用了不正确的修复,因此参考str2
是不正确的。不正确的修复导致我们打印出不正确的内存str2
.
NASM 有一个错误报告 https://bugzilla.nasm.us/show_bug.cgi?id=3392468#c6关于他们系统中的这个问题。我根据问题中的代码添加了此失败的具体示例。希望 NASM 开发人员能够重现故障并创建修复程序。
Update:截至 2018 年 6 月,我的观点是 NASM 中存在足够多的重复出现的错误和回归,因此我目前不推荐 NASM 进行 Macho-64 开发。
我对 Macho-64 开发的另一个建议是使用 RIP 相对寻址而不是绝对寻址。 RIP 相对寻址是 MacOS 更高版本上 64 位程序的默认设置。
在 NASM 中,您可以使用default rel
文件中的指令将默认地址从绝对地址更改为 RIP 相对地址。为此,您必须从使用更改mov register, variable
to lea register, [variable]
当尝试将变量的地址移动到寄存器时。您修改后的代码可能如下所示:
default rel
%macro printString 2
mov rax, 0x2000004 ; write
mov rdi, 1 ; stdout
lea rsi, [%1]
mov rdx, %2
syscall
%endmacro
global start
section .text
start:
printString str1,str1.len
printString str2,str2.len
mov rax, 0x2000001 ; exit
mov rdi, 0
syscall
section .data
str1: db "Hello,",10
.len: equ $ - str1
str2: db "world",10
.len: equ $ - str2