Macos Mac OS X:YASM:error:macho:抱歉,无法在64模式下应用32位绝对重定位

Macos Mac OS X:YASM:error:macho:抱歉,无法在64模式下应用32位绝对重定位,macos,assembly,nasm,yasm,Macos,Assembly,Nasm,Yasm,NASM编译得很好,但当我使用YASM时,会出现以下错误: 您好。asm:12:错误:macho:抱歉,无法应用32位绝对值 重定位在64位模式,考虑“[符号WRT RIP]”的MEM 访问“qword”和“dq_-foo”以获取指针 生成文件 test: hello ./hello hello: yasm -f macho64 hello.asm ld -o hello hello.o clean: rm *.o *.core hello 系统公司 %d

NASM编译得很好,但当我使用YASM时,会出现以下错误:

您好。asm:12:错误:macho:抱歉,无法应用32位绝对值 重定位在64位模式,考虑“[符号WRT RIP]”的MEM 访问“qword”和“dq_-foo”以获取指针

生成文件

test: hello
    ./hello
hello:
    yasm -f macho64 hello.asm   
    ld -o hello hello.o
clean:
    rm *.o *.core hello
系统公司

%define stdin       0
%define stdout      1
%define stderr      2

%define SYS_nosys   0
%define SYS_exit    1
%define SYS_fork    2
%define SYS_read    3
%define SYS_write   4

section .text
align 4
access.the.osx.kernel:
    syscall
    ret

%macro  system  1
    mov rax, %1
    call    access.the.osx.kernel
%endmacro

%macro  sys.exit    0
    system  SYS_exit
%endmacro

%macro  sys.write   0
    system  SYS_write
%endmacro
你好,asm

%include 'system.inc'

section .data
hello   db  'Hello, World!', 0Ah
hbytes  equ $-hello

section .text
global  start
start:
mov rax, 0x2000004
mov rdi, stdout
mov rsi, hello
mov rdx, hbytes
syscall
;sys.write

xor rdi, rdi
mov rax, 0x2000001
syscall
;sys.exit

有人知道发生了什么吗?如果你能解释为什么NASM能工作,但YASM不能,那将是一个额外的收获。

我让它工作了。在
yasm
中,您必须明确告诉它地址是64位的,如下所示:

mov rsi, qword hello

文档在这里讨论了这种情况:

我认为您需要
lea rsi,hello
mov rsi,offset hello
或类似的东西。@IgorSkochinsky我认为您是对的。我只是不知道是什么。我正在阅读YASM手册,看看我需要做什么。我认为NASM可以进行推断,通过使用YASM,我认为您需要明确说明大小(我认为)。使用
default rel
可以解决这个问题。更多信息:@harold谢谢,这正是我读到的。RIP相对LEA的代码更小,可能是更好的选择。(这是编译器所使用的,并使您的代码实际上独立于位置,我认为Mach-O无论如何都需要它。)使用
default rel
指令,或
learsi,[rel hello]
中的显式rel。