From 848c0c6a3fcd3a05a2d8d5fbb3eb550bc423f807 Mon Sep 17 00:00:00 2001 From: Druid520 Date: Mon, 17 Aug 2026 10:47:46 -0700 Subject: ADD: charge basics stuff. --- cfg.ld | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ mk.conf | 23 +++++++++++++++++++++++ mk/b.sh | 9 +++++++++ mk/c.sh | 4 ++++ src/main.c | 6 ++++++ src/note.s | 9 +++++++++ src/start.s | 17 +++++++++++++++++ 7 files changed, 123 insertions(+) create mode 100644 cfg.ld create mode 100644 mk.conf create mode 100644 mk/b.sh create mode 100644 mk/c.sh create mode 100644 src/main.c create mode 100644 src/note.s create mode 100644 src/start.s diff --git a/cfg.ld b/cfg.ld new file mode 100644 index 0000000..a4dc193 --- /dev/null +++ b/cfg.ld @@ -0,0 +1,55 @@ +OUTPUT_FORMAT("elf64-x86-64") +OUTPUT_ARCH("i386:x86-64") +ENTRY(_start) + +SECTIONS +{ + . = 0x100000; /* start at 1mb. */ + + .text : ALIGN(4K) + { + *(.text.startup) + *(.text) + *(.text.*) + } + + .rodata : ALIGN(4K) + { + *(.rodata) + *(.rodata.*) + } + + .data : ALIGN(4K) + { + *(.data) + *(.data.*) + } + + .bss : ALIGN(4K) + { + *(.bss) + *(.bss.*) + *(COMMON) + } + + .note.netbsd.ident : ALIGN(4) + { + *(.note.netbsd.ident) + } + + /DISCARD/ : + { + *(.comment) + *(.eh_frame) + *(.eh_frame_hdr) + *(.debug_*) + *(.stab) + *(.stabstr) + *(.shstrtab) + *(.strtab) + *(.symtab) + } +} + +PROVIDE(__stack = 0x400000); +PROVIDE(_end = .); diff --git a/mk.conf b/mk.conf new file mode 100644 index 0000000..8f3ff1f --- /dev/null +++ b/mk.conf @@ -0,0 +1,23 @@ +src="src" +out="out" + +bin="$out/bin" +bin_ln="bin" + +note_src="$src/note.s" +note_bin="$out/note.o" +start_src="$src/start.s" +start_bin="$out/start.o" +main_src="$src/main.c" +main_bin="$out/main.o" + +ln="ln" +as="as" +ld="ld" +ld_cfg="cfg.ld" +cc="gcc" + +lnflgs="-sf" +asflgs="" +ldflgs="-O0 -static -no-pie -T $ld_cfg" +ccflgs="-nostdlib -ffreestanding -fno-pie -fno-builtin -std=c99 -O0 -g0" diff --git a/mk/b.sh b/mk/b.sh new file mode 100644 index 0000000..d8b27d5 --- /dev/null +++ b/mk/b.sh @@ -0,0 +1,9 @@ +. ./mk.conf +set -e + +mkdir $out +$as $asflgs -o $note_bin $note_src +$as $asflgs -o $start_bin $start_src +$cc $ccflgs -o $main_bin -c $main_src +$ld $ldflgs -o $bin $note_bin $start_bin $main_bin +$ln $lnflgs $bin $bin_ln diff --git a/mk/c.sh b/mk/c.sh new file mode 100644 index 0000000..d637651 --- /dev/null +++ b/mk/c.sh @@ -0,0 +1,4 @@ +. ./mk.conf +set -e + +rm -rf $out $bin_ln diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..83423bb --- /dev/null +++ b/src/main.c @@ -0,0 +1,6 @@ +int main(int argc, char** argv); + +int main(int argc, char** argv) +{ + return 0; +} diff --git a/src/note.s b/src/note.s new file mode 100644 index 0000000..a8b606e --- /dev/null +++ b/src/note.s @@ -0,0 +1,9 @@ +.section .note.netbsd.ident, "a" # allocatable section. + .align 4 + .int 7 # namesz = "NetBSD" = 7 bytes. + .int 4 # descsz = version = 4 bytes. + .int 1 # type = ELF_NOTE_TYPE_NETBSD_TAG. + .ascii "NetBSD" # name. + .byte 0 # null term for name. + .long 110000000 # desc = 11.0 (netbsd ver). + .align 4 diff --git a/src/start.s b/src/start.s new file mode 100644 index 0000000..58efed0 --- /dev/null +++ b/src/start.s @@ -0,0 +1,17 @@ +.section .text +.globl _start +.type _start, @function +_start: + xorq %rbp, %rbp # frame ptr (%rbp) = null. marks stack bottom. + + movl (%rsp), %edi # argc = first 4 bytes of stack. + leaq 8(%rsp), %rsi # argv = address of first arg ptr. + + call main # see main.c. + + movl %eax, %edi # status = ret val. + movl $1, %eax # SYS_exit = 1. + syscall + + .size _start, .-_start + hlt # if syscall fails hang. -- cgit 1.4.1