feat(sys): add sys lib

This commit is contained in:
2026-04-20 23:50:04 +02:00
parent d5be4cfe0b
commit 4cacdeb012
6 changed files with 57 additions and 33 deletions

View File

@@ -17,8 +17,17 @@ target_link_libraries(strings PRIVATE c-libs)
add_executable(rc ${CMAKE_CURRENT_SOURCE_DIR}/app/rc.c) add_executable(rc ${CMAKE_CURRENT_SOURCE_DIR}/app/rc.c)
target_link_libraries(rc PRIVATE c-libs) target_link_libraries(rc PRIVATE c-libs)
add_executable(nolibc ${CMAKE_CURRENT_SOURCE_DIR}/app/nolibc.c add_library(
${CMAKE_CURRENT_SOURCE_DIR}/app/entry.s) 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 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
add_executable(nolibc ${CMAKE_CURRENT_SOURCE_DIR}/app/nolibc.c)
target_link_libraries(nolibc PRIVATE sys)
target_compile_options( target_compile_options(
nolibc PRIVATE -fno-asynchronous-unwind-tables -fno-unwind-tables nolibc PRIVATE -fno-asynchronous-unwind-tables -fno-unwind-tables
-fno-stack-protector -ffunction-sections -fdata-sections) -fno-stack-protector -ffunction-sections -fdata-sections)
@@ -50,7 +59,7 @@ include(CMakePackageConfigHelpers)
include(GNUInstallDirs) include(GNUInstallDirs)
install( install(
TARGETS c-libs TARGETS c-libs sys
EXPORT c-libs EXPORT c-libs
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}

View File

@@ -1,16 +1,4 @@
void *syscall5(void *number, void *arg1, void *arg2, void *arg3, void *arg4, #include <c-libs/sys/syscall.h>
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 */
);
}
int main() { int main() {
write(0, "Hello World!\n", 13); write(0, "Hello World!\n", 13);

View File

@@ -0,0 +1,21 @@
#ifndef CLIBS_SYS_SYSCALL_H
#define CLIBS_SYS_SYSCALL_H
#include <asm/types.h>
#include <asm/unistd.h>
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

20
src/sys/entry.s Normal file
View File

@@ -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

2
src/sys/syscall.c Normal file
View File

@@ -0,0 +1,2 @@
#define CLIBS_SYS_SYSCALL_IMPL
#include <c-libs/sys/syscall.h>

View File

@@ -1,20 +1,4 @@
.global _start, syscall5 .global 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
syscall5: syscall5:
mov %rdi, %rax /* %rax (syscall number) = func param 1 (%rdi) */ mov %rdi, %rax /* %rax (syscall number) = func param 1 (%rdi) */