From 4cacdeb01233a82d47b54c94b1dda10ec48e63e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20R=C3=B6ger?= Date: Mon, 20 Apr 2026 23:50:04 +0200 Subject: [PATCH] feat(sys): add sys lib --- CMakeLists.txt | 15 ++++++++++++--- app/nolibc.c | 14 +------------- include/c-libs/sys/syscall.h | 21 +++++++++++++++++++++ src/sys/entry.s | 20 ++++++++++++++++++++ src/sys/syscall.c | 2 ++ app/entry.s => src/sys/syscall.s | 18 +----------------- 6 files changed, 57 insertions(+), 33 deletions(-) create mode 100644 include/c-libs/sys/syscall.h create mode 100644 src/sys/entry.s create mode 100644 src/sys/syscall.c rename app/entry.s => src/sys/syscall.s (70%) diff --git a/CMakeLists.txt b/CMakeLists.txt index f827595..01afdc6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,8 +17,17 @@ target_link_libraries(strings PRIVATE c-libs) add_executable(rc ${CMAKE_CURRENT_SOURCE_DIR}/app/rc.c) target_link_libraries(rc PRIVATE c-libs) -add_executable(nolibc ${CMAKE_CURRENT_SOURCE_DIR}/app/nolibc.c - ${CMAKE_CURRENT_SOURCE_DIR}/app/entry.s) +add_library( + sys STATIC + ${CMAKE_CURRENT_SOURCE_DIR}/src/sys/entry.s + ${CMAKE_CURRENT_SOURCE_DIR}/src/sys/syscall.s + ${CMAKE_CURRENT_SOURCE_DIR}/src/sys/syscall.c) +target_include_directories( + sys PUBLIC $ + $) + +add_executable(nolibc ${CMAKE_CURRENT_SOURCE_DIR}/app/nolibc.c) +target_link_libraries(nolibc PRIVATE sys) target_compile_options( nolibc PRIVATE -fno-asynchronous-unwind-tables -fno-unwind-tables -fno-stack-protector -ffunction-sections -fdata-sections) @@ -50,7 +59,7 @@ include(CMakePackageConfigHelpers) include(GNUInstallDirs) install( - TARGETS c-libs + TARGETS c-libs sys EXPORT c-libs ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/app/nolibc.c b/app/nolibc.c index 3636b91..5085c71 100644 --- a/app/nolibc.c +++ b/app/nolibc.c @@ -1,16 +1,4 @@ -void *syscall5(void *number, void *arg1, void *arg2, void *arg3, void *arg4, - void *arg5); - -typedef unsigned long int size_t; -typedef long int ssize_t; - -static ssize_t write(int fd, void const *data, size_t nbytes) { - return (ssize_t)syscall5((void *)1, /* SYS_write, call number 1 */ - (void *)(size_t)fd, (void *)data, (void *)nbytes, - 0, /* Ignored */ - 0 /* Ignored */ - ); -} +#include int main() { write(0, "Hello World!\n", 13); diff --git a/include/c-libs/sys/syscall.h b/include/c-libs/sys/syscall.h new file mode 100644 index 0000000..d1e02bf --- /dev/null +++ b/include/c-libs/sys/syscall.h @@ -0,0 +1,21 @@ +#ifndef CLIBS_SYS_SYSCALL_H +#define CLIBS_SYS_SYSCALL_H + +#include +#include + +void *syscall5(void *number, void *arg1, void *arg2, void *arg3, void *arg4, + void *arg5); + +__s64 write(int fd, void const *data, __u64 nbytes); + +#endif + +#ifdef CLIBS_SYS_SYSCALL_IMPL + +__s64 write(int fd, void const *data, __u64 nbytes) { + return (__s64)syscall5((void *)__NR_write, (void *)(__u64)fd, (void *)data, + (void *)nbytes, 0, 0); +} + +#endif diff --git a/src/sys/entry.s b/src/sys/entry.s new file mode 100644 index 0000000..c0c7a4e --- /dev/null +++ b/src/sys/entry.s @@ -0,0 +1,20 @@ +.global _start + + +_start: + /* Load argc -> rdi, argv[0] -> rsi */ + xor %rbp, %rbp + pop %rdi + mov %rsp, %rsi + + /* align stack pointer to 16-bits */ + and $0xFFFFFFFFFFFFFFF0, %rsp + + call main + + /* Exit with ret val of main */ + mov %rax, %rdi + mov $0x3C, %rax + syscall + +.section .note.GNU-stack,"",@progbits diff --git a/src/sys/syscall.c b/src/sys/syscall.c new file mode 100644 index 0000000..a469f5b --- /dev/null +++ b/src/sys/syscall.c @@ -0,0 +1,2 @@ +#define CLIBS_SYS_SYSCALL_IMPL +#include diff --git a/app/entry.s b/src/sys/syscall.s similarity index 70% rename from app/entry.s rename to src/sys/syscall.s index ed1e48a..48da149 100644 --- a/app/entry.s +++ b/src/sys/syscall.s @@ -1,20 +1,4 @@ -.global _start, syscall5 - - -_start: - /* Load argc -> rdi, argv[0] -> rsi */ - xor %rbp, %rbp - pop %rdi - mov %rsp, %rsi - - and $0xFFFFFFFFFFFFFFF0, %rsp - - call main - - /* Exit with ret val of main */ - mov %rax, %rdi - mov $0x3C, %rax - syscall +.global syscall5 syscall5: mov %rdi, %rax /* %rax (syscall number) = func param 1 (%rdi) */