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

时间:2013-01-15 17:19:59

标签: macos assembly nasm yasm

NASM编译得很好,但是当我使用YASM时,我收到以下错误:

  

hello.asm:12:错误:男子气概:抱歉,无法应用32位绝对值   在64位模式下重定位,考虑mem的“[_symbol wrt rip]”   访问,“qword”和“dq _foo”指针。

生成文件

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

system.inc

%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

hello.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

任何人都知道发生了什么事吗?如果你能解释为什么NA​​SM会起作用,但是YASM不会那么奖励。

1 个答案:

答案 0 :(得分:2)

我得到了它的工作。在yasm中,您必须明确告诉它地址是64位的:

mov rsi, qword hello

文档讨论了这里的情况:https://github.com/yasm/yasm/wiki/AMD64