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
из печати.