Load raw C binary + docs
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
CC := x86_64-elf-gcc
|
||||
CC_FLAGS := -ffreestanding -nostdlib -fno-pic -mno-red-zone -Ilibc
|
||||
|
||||
LD := x86_64-elf-ld
|
||||
|
||||
BUILDDIR := ../build
|
||||
LIBDIR := libc
|
||||
|
||||
all: pedicel apex
|
||||
|
||||
pedicel:
|
||||
nasm -f bin pedicel.S -o $(BUILDDIR)/pedicel.raw
|
||||
|
||||
apex:
|
||||
$(CC) $(CC_FLAGS) -c apex.c -o $(BUILDDIR)/apex.o
|
||||
nasm -f elf64 $(LIBDIR)/crt0.S -o $(BUILDDIR)/crt0.o
|
||||
$(LD) -T $(LIBDIR)/linker.ld $(BUILDDIR)/crt0.o $(BUILDDIR)/apex.o -o $(BUILDDIR)/apex.elf
|
||||
objcopy -O binary $(BUILDDIR)/apex.elf $(BUILDDIR)/apex.raw
|
||||
@@ -0,0 +1,7 @@
|
||||
#include <syscall.h>
|
||||
|
||||
int main() {
|
||||
const char* msg = "hi from C userland\r\n";
|
||||
write(1, msg, 21);
|
||||
return 42;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
bits 64
|
||||
|
||||
section .data
|
||||
hi db "hi from userland :) we did it man", 0x0A, 0x0d, 0
|
||||
|
||||
section .text
|
||||
|
||||
hello:
|
||||
mov rax, 0x1 ;sys_write
|
||||
mov rdi, 0x1 ;stdout
|
||||
lea rsi, [rel hi] ;char* buf
|
||||
mov rdx, 35 ;count
|
||||
int 0x80
|
||||
|
||||
.end:
|
||||
mov rax, 0x3C ;sys_exit
|
||||
mov rdi, 0x0 ;error_code
|
||||
int 0x80
|
||||
|
||||
.loop:
|
||||
jmp .loop
|
||||
@@ -0,0 +1,18 @@
|
||||
bits 64
|
||||
global _start
|
||||
extern main
|
||||
|
||||
section .text
|
||||
|
||||
; Begin the program with main() function
|
||||
_start:
|
||||
call main
|
||||
|
||||
; Exit the program by exit() syscall
|
||||
.exit:
|
||||
mov rdi, rax ; put the value of "return X;" (rax) as arg1 (error_code)
|
||||
mov rax, 60 ; sys_exit
|
||||
int 0x80
|
||||
|
||||
.loop:
|
||||
jmp .loop
|
||||
@@ -0,0 +1,22 @@
|
||||
ENTRY(_start)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x400000;
|
||||
|
||||
.text : {
|
||||
*(.text*)
|
||||
}
|
||||
|
||||
.rodata : {
|
||||
*(.rodata*)
|
||||
}
|
||||
|
||||
.data : {
|
||||
*(.data*)
|
||||
}
|
||||
|
||||
.bss : {
|
||||
*(.bss*)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
// 3 because 3 arguments to the call, get it??
|
||||
static inline long syscall3(long n, long a, long b, long c) {
|
||||
long ret;
|
||||
|
||||
__asm__ volatile (
|
||||
"int $0x80"
|
||||
: "=a"(ret)
|
||||
: "a"(n), "D"(a), "S"(b), "d"(c)
|
||||
: "memory"
|
||||
);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void write(int fd, const char* buf, long len) {
|
||||
syscall3(1, fd, (long)buf, len);
|
||||
}
|
||||
|
||||
static inline void exit(int code) {
|
||||
__asm__ volatile (
|
||||
"int $0x80"
|
||||
:
|
||||
: "a"(60), "D"(code)
|
||||
: "memory"
|
||||
);
|
||||
|
||||
for (;;);
|
||||
}
|
||||
Reference in New Issue
Block a user