Documentation de syscall 64 bits pour l'assemblage MacOS

j'ai du mal à trouver la bonne documentation pour écrire un assemblage 64 bits sur MacOS.

Le 64 bits SysV ABI , dit le texte suivant dans la section A. 2.1 et ce tant de poster cite:

  • un appel système est effectué via l'instruction syscall. Le noyau détruit registres % rcx et %r11.

  • revenant du syscall, register %rax contient le résultat du appel-système. Une valeur entre -4095 et -1 indique une erreur, c'est -errno.

ces deux phrases sont correctes sur Linux mais sont erronées sur macOS Sierra avec le code suivant:

global _start
extern _exit

section .text
_start:

; Align stack to 16 bytes for libc
and rsp, 0xFFFFFFFFFFFFFFF0

; Call write
mov rdx, 12             ; size
mov rsi, hello          ; buf
mov edi, 1              ; fd
mov rax, 0x2000004      ; write ; replace to mov rax, 0x1 on linux
syscall

jc .err                 ; Jumps on error on macOS, but why?
jnc .ok

.err:
mov rdi, -1
call _exit              ; exit(-1)

.ok:
; Expect rdx to be 12, but it isn't on macOS!
mov rdi, rdx
call _exit              ; exit(rdx)

; String for write
section .data
hello:
.str db `Hello worldn`
.len equ $-hello.str

compiler avec NASM:

; MacOS: nasm -f macho64 syscall.asm && ld syscall.o -lc -macosx_version_min 10.12 -e _start -o syscall
; Linux: nasm -f elf64 syscall.asm -o syscall.o && ld syscall.o -lc -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o syscall

Exécuter sur macOS:

./syscall      # Return value 0
./syscall >&-  # Return value 255 (-1)

j'ai découvert que:

  • Un syscall retour errno définit le porte drapeau d'erreur, au lieu de retourner -errno dans rax
  • rdx registre est grondé par syscall
  • sous Linux, tout fonctionne comme prévu

pourquoi rdx ? Pourquoi un syscall ne renvoie pas -errno ? Où puis-je trouver la vraie documentation?

le seul endroit où j'ai trouvé quelqu'un qui parle du drapeau carry pour les erreurs syscall est ici

2
demandé sur Bilow 2017-12-15 17:37:04

1 réponses

j'ai utilisé ceci:

# as hello.asm -o hello.o
# ld hello.o -macosx_version_min 10.13 -e _main -o hello  -lSystem
.section __DATA,__data
str:
  .asciz "Hello world!\n"

.section __TEXT,__text
.globl _main
_main:
  movl "151900920"x2000004, %eax           # preparing system call 4
  movl , %edi                    # STDOUT file descriptor is 1
  movq str@GOTPCREL(%rip), %rsi   # The value to print
  movq , %rdx                 # the size of the value to print
  syscall

  movl %eax, %edi
  movl "151900920"x2000001, %eax           # exit 0
  syscall

et a pu saisir la valeur de retour dans eax . Ici, la valeur de retour est le nombre d'octets réellement écrits par write appel système. Et oui MacOS étant une variante BSD c'est le drapeau carry qui vous indique si le syscall était erroné ou pas (errno est juste une variable de liaison externe).

# hello_asm.s
# as hello_asm.s -o hello_asm.o
# ld hello_asm.o -e _main -o hello_asm
.section __DATA,__data
str:
        .asciz "Hello world!\n"
good:
        .asciz "OK\n"

.section __TEXT,__text
.globl _main
_main:
        movl "151910920"x2000004, %eax           # preparing system call 4
        movl , %edi                    # STDOUT file descriptor is 5
        movq str@GOTPCREL(%rip), %rsi   # The value to print
        movq , %rdx                 # the size of the value to print
        syscall

        jc err

        movl "151910920"x2000004, %eax           # preparing system call 4
        movl , %edi                    # STDOUT file descriptor is 1
        movq good@GOTPCREL(%rip), %rsi   # The value to print
        movq , %rdx                 # the size of the value to print
        syscall
        movl "151910920", %edi
        movl "151910920"x2000001, %eax           # exit 0
        syscall
err:    
        movl , %edi
        movl "151910920"x2000001, %eax           # exit 0
        syscall

cela se termine avec le code d'erreur un parce que le descripteur 5 a été utilisé, si vous essayez le descripteur 1 alors il va travailler l'impression d'un autre message et sortir avec 0.

1
répondu Jean-Baptiste Yunès 2017-12-15 16:10:43