Mac OS X: YASM: ошибка: macho: извините, нельзя применять 32-битные абсолютные перемещения в 64-разрядном режиме

NASM прекрасно компилируется, но когда я использую YASM, я получаю следующую ошибку:

hello.asm:12: error: macho: извините, нельзя применять 32-битные абсолютные перемещения в 64-битном режиме, рассмотрите «[_symbol wrt rip]» для доступа к памяти, «qword» и «dq _foo» для указателей.

Makefile

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

привет.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 — нет, это было бы бонусом.


person EhevuTov    schedule 15.01.2013    source источник
comment
Я думаю, вам нужно lea rsi, hello или mov rsi, offset hello или что-то в этом роде.   -  person Igor Skochinsky    schedule 15.01.2013
comment
@IgorSkochinsky Думаю, ты прав. Я просто не уверен, что это такое. Я читаю руководство YASM, чтобы понять, что мне нужно делать. Я думаю, что NASM в порядке с выводом, с YASM я думаю, вам нужно четко указать размер (я думаю).   -  person EhevuTov    schedule 15.01.2013
comment
Использование default rel может исправить это. Подробнее здесь: tortall.net/projects/yasm/manual/ html/nasm-effaddr.html   -  person harold    schedule 15.01.2013
comment
@harold спасибо, это действительно то, что я читал.   -  person EhevuTov    schedule 15.01.2013


Ответы (1)


Я заработал. В yasm вы должны явно указать, что адрес 64-битный, например:

mov rsi, qword hello

В документации описана ситуация здесь: https://github.com/yasm/yasm/wiki/AMD64

person EhevuTov    schedule 15.01.2013
comment
RIP-относительный LEA имеет меньший размер кода и, вероятно, является лучшим выбором. (Это то, что используют компиляторы, и это делает ваш код фактически независимым от позиции, что, я думаю, Mach-O в любом случае требует.) Используйте директиву default rel или явный REL в lea rsi, [rel hello]. - person Peter Cordes; 08.12.2017