Как вызвать функцию C из сборки x86-64 на Mac (проблемы с выравниванием стека и / или сборкой Makefile) - PullRequest
0 голосов
/ 23 марта 2019

tl; dr Я получаю несколько разных ошибок в зависимости от того, как я пытаюсь вызвать функцию C _print из сборки x86-64. Я хотел бы получить печать, вызывая функцию C, так что я знаю, что могу вызывать функции C, но я не уверен, как выполнить «выравнивание по стеку», чтобы это произошло правильно. Полный исходный код системы включен.


Я пытался следовать этим инструкциям, но я получаю это:

Segmentation fault: 11

Моя сборка выглядит так:

section .text

global start
extern _print

start:
  mov rdi, msg
  jmp _print

section .data

msg: db  0xa, "  Hello StackOverflow!!!", 0xa, 0xa, 0
.len: equ $ - msg

Моя print.c функция выглядит так:

#import <stdio.h>

extern
void
print(char *str) {
  puts("FOO");
  puts(str);
}

Я могу использовать функцию print в C напрямую, поэтому я знаю, что это работает. Так что я должен видеть FOO в выводе, но я просто вижу что-то вроде этого, за которым следует ошибка:

Hello StackOverflow!!@���

Я скомпилировал проект C следующим образом:

print:
  @clang -I . -dynamiclib \
    -O2 \
    -undefined dynamic_lookup \
    -o print.dylib print.c
.PHONY: print

И я скомпилировал проект asm так:

asm:
  @nasm -f macho64 main.asm
  @ld -macosx_version_min 10.13.0 \
    -lSystem -o main \
    -install_name print.dylib \
    main.o print.dylib
  @./main
.PHONY: asm

Я не понимаю, как применить эту концепцию стекового фрейма / выравнивания к 64-битной архитектуре.

Повозился, и я попытался изменить start на это. Я понятия не имею, почему (не понимаю, как применить выравнивание стека):

start:
  push rbx
  mov rdi, msg
  call _print
  pop rbx

В итоге выдается следующее:

  Hello StackOverflow!!@���make: *** [asm] Error 109

Все еще нет FOO из печати. ​​

...