Попробуйте этот пример (протестировано на FreeBSD 12 )
Сохраните это в hello.s
:
section .data
message:
db 'hello, world!', 10
section .text
global _start
_start:
mov rax, 4
mov rdi, 1
mov rsi, message
mov rdx, 14
syscall
mov rax, 1
xor rdi, rdi
syscall
Установите nasm
:
# pkg install nasm
Теперь выполните сборку с:
$ nasm -f elf64 hello.s
Это создаст файл hello.o
, который вы свяжете с помощью ld :
$ ld -m elf_amd64_fbsd -o hello -s hello.o
Это должно создать файл с именем hello
:
$ ./hello
hello, world!
Если вы просто попробуете:
$ ld -o hello -s hello.o
После попытки запустить его вы можете получить эту ошибку:
ELF binary type "0" not known.
./hello: Exec format error. Binary file not executable.
Проверьте этот пост (elf_i386_fbsd) , а также этот ответ для дальнейшего использования.
Чтобы исправить вставленный код, замените:
mov rax, 1
с
mov rax, 4
в противном случае, похоже, просто для выхода.
Вы можете найти эти системные вызовы числа в /usr/include/sys/syscall.h
, дляпример:
/*
* System call numbers.
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD: stable/12/sys/sys/syscall.h 339002 2018-09-28 17:25:28Z jhb $
*/
#define SYS_syscall 0
#define SYS_exit 1
#define SYS_fork 2
#define SYS_read 3
#define SYS_write 4
#define SYS_open 5
#define SYS_close 6
#define SYS_wait4 7
/* 8 is old creat */
#define SYS_link 9
#define SYS_unlink 10
/* 11 is obsolete execv */
#define SYS_chdir 12
#define SYS_fchdir 13
#define SYS_freebsd11_mknod 14
#define SYS_chmod 15
#define SYS_chown 16
#define SYS_break 17