Macos Mac OS X:YASM:error:macho:抱歉,无法在64模式下应用32位绝对重定位
NASM编译得很好,但当我使用YASM时,会出现以下错误: 您好。asm:12:错误:macho:抱歉,无法应用32位绝对值 重定位在64位模式,考虑“[符号WRT RIP]”的MEM 访问“qword”和“dq_-foo”以获取指针 生成文件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
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。