hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-09-25 11:31:59 +0200
committerhachem <im@hachem.wtf>2026-09-25 11:31:59 +0200
commited285c9fc665e262ed21c7bf5734acb2b7a532db (patch)
treee51434e8069bc7219221cc1136515828d0293aca /user
parentd18d1da05a4d065d54787434d6bc46f3354626a5 (diff)
feat: load + run native ELF binaries
Diffstat (limited to 'user')
-rw-r--r--user/link.ld8
-rw-r--r--user/program.c22
2 files changed, 30 insertions, 0 deletions
diff --git a/user/link.ld b/user/link.ld
new file mode 100644
index 0000000..9dc8402
--- /dev/null
+++ b/user/link.ld
@@ -0,0 +1,8 @@
+ENTRY(_start)
+SECTIONS {
+ . = 0x400000;
+ .text : ALIGN(0x1000) { *(.text*) }
+ .rodata : ALIGN(0x1000) { *(.rodata*) }
+ .data : ALIGN(0x1000) { *(.data*) }
+ .bss : ALIGN(0x1000) { *(.bss*) *(COMMON) }
+}
diff --git a/user/program.c b/user/program.c
new file mode 100644
index 0000000..8e26128
--- /dev/null
+++ b/user/program.c
@@ -0,0 +1,22 @@
+static long sys_write(const char* buffer, unsigned long buffer_size)
+{
+ long ret;
+ __asm__ volatile("int $0x80" : "=a"(ret) : "a"(1L), "D"(buffer), "S"(buffer_size) : "memory");
+ return ret;
+}
+static void sys_exit(long code)
+{
+ __asm__ volatile("int $0x80" : : "a"(0L), "D"(code) : "memory");
+ for (;;);
+}
+
+void _start(void)
+{
+ const char* message = "wassup shawty\n";
+ unsigned long message_length = 0;
+ while (message[message_length])
+ message_length++;
+
+ sys_write(message, message_length);
+ sys_exit(0);
+}