feat(sys): add sys lib
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
14
app/nolibc.c
14
app/nolibc.c
@@ -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);
|
||||||
|
|||||||
21
include/c-libs/sys/syscall.h
Normal file
21
include/c-libs/sys/syscall.h
Normal 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
20
src/sys/entry.s
Normal 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
2
src/sys/syscall.c
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#define CLIBS_SYS_SYSCALL_IMPL
|
||||||
|
#include <c-libs/sys/syscall.h>
|
||||||
@@ -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) */
|
||||||
Reference in New Issue
Block a user