nasm по умолчанию для macos mojave 10.14.1

#assembly #printf #nasm #macos-mojave

#сборка #printf #nasm #macos-mojave

Вопрос:

Недавно я обновил свою ОС, теперь я работаю под Mojave 10.14.1. Я также обновил свой Xcode, который успешно удалил мое предупреждение во время компоновки. Но я все еще не могу понять, почему простая программа printf с NASM x86_64 теперь всегда segfault в конце ее выполнения… Вот мой код :

   section .data
    str db "Hello World", 10

section .text
    global start
    global _main
    extern _printf

start:
    call _main
    ret

_main:
    push    rbp
    sub rsp, rbp
    sub rsp, 16
    lea rdi, [rel str]
    call    _printf
    xor rax, rax
    leave
    ret
  

Сообщение Hello World всегда выводится в стандартный вывод, как и ожидалось, но впоследствии оно выдает ошибку segfault…
Вот мои строки компиляции

 nasm -fmacho64 hello.s -o hello.o
ld hello.o -macosx_version_min 10.12 -lSystem
  

С lldb я действительно не могу понять проблему, но я получил это :

 thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x18)
    frame #0: 0x0000000000001fdc a.out`main   47
a.out`main:
->  0x1fdc < 47>: leave
    0x1fdd < 48>: retq

a.out`printf:
    0x1fde < 0>:  jmpq   *0x2c(%rip)               ; (void *)0x00007fff750f48ec: printf
    0x1fe4:       leaq   0x1d(%rip), %r11          ; (void *)0x0000000000087e80: initialPoolContent   624
Target 1: (a.out) stopped.
  

если кто-нибудь знает, как это решить, это было бы отличной помощью!
Спасибо!

Комментарии:

1. Действительно, я виноват! большое вам спасибо! Мне все еще нужно выяснить, как именно работает стек… по крайней мере, ошибка segfault теперь устранена!

2. Я допустил опечатку в своем оригинале. Это должно было быть: sub rsp, rbp должно быть mov rbp, rsp . sub rsp, 16 не повредит, но это не нужно, поскольку у вас нет никаких локальных переменных.