From c0d38862f2435a0a311b9bffc368ac47f42ac314 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 1 Jul 2026 12:58:09 +0300 Subject: [PATCH] LibC: Add sys/auxv.h with getauxval --- userspace/libraries/LibC/CMakeLists.txt | 1 + userspace/libraries/LibC/include/elf.h | 12 ++++++ userspace/libraries/LibC/include/sys/auxv.h | 14 +++++++ userspace/libraries/LibC/sys/auxv.cpp | 40 +++++++++++++++++++ userspace/libraries/LibC/unistd.cpp | 25 +----------- .../LibELF/include/LibELF/AuxiliaryVector.h | 2 + 6 files changed, 70 insertions(+), 24 deletions(-) create mode 100644 userspace/libraries/LibC/include/sys/auxv.h create mode 100644 userspace/libraries/LibC/sys/auxv.cpp diff --git a/userspace/libraries/LibC/CMakeLists.txt b/userspace/libraries/LibC/CMakeLists.txt index f8bc460c..9151fd75 100644 --- a/userspace/libraries/LibC/CMakeLists.txt +++ b/userspace/libraries/LibC/CMakeLists.txt @@ -40,6 +40,7 @@ set(LIBC_SOURCES stdlib.cpp string.cpp strings.cpp + sys/auxv.cpp sys/banan-os.cpp sys/epoll.cpp sys/eventfd.cpp diff --git a/userspace/libraries/LibC/include/elf.h b/userspace/libraries/LibC/include/elf.h index ecde56d4..62c57cb9 100644 --- a/userspace/libraries/LibC/include/elf.h +++ b/userspace/libraries/LibC/include/elf.h @@ -149,6 +149,18 @@ __BEGIN_DECLS #define DT_LOPROC 0x70000000 #define DT_HIPROC 0x7FFFFFFF +#define AT_NULL 0 +#define AT_IGNORE 1 +#define AT_EXECFD 2 +#define AT_PHDR 3 +#define AT_PHENT 4 +#define AT_PHNUM 5 +#define AT_PAGESZ 6 +#define AT_BASE 7 +#define AT_SHARED_PAGE 0xFFFF0001 +#define AT_STACK_BASE 0xFFFF0002 +#define AT_STACK_SIZE 0xFFFF0003 + #define R_386_NONE 0 #define R_386_32 1 #define R_386_PC32 2 diff --git a/userspace/libraries/LibC/include/sys/auxv.h b/userspace/libraries/LibC/include/sys/auxv.h new file mode 100644 index 00000000..21c95822 --- /dev/null +++ b/userspace/libraries/LibC/include/sys/auxv.h @@ -0,0 +1,14 @@ +#ifndef _SYS_AUXV_H +#define _SYS_AUXV_H 1 + +#include + +__BEGIN_DECLS + +#include + +unsigned long getauxval(unsigned long type); + +__END_DECLS + +#endif diff --git a/userspace/libraries/LibC/sys/auxv.cpp b/userspace/libraries/LibC/sys/auxv.cpp new file mode 100644 index 00000000..c871b113 --- /dev/null +++ b/userspace/libraries/LibC/sys/auxv.cpp @@ -0,0 +1,40 @@ +#include +#include + +#include + +struct auxv +{ + unsigned long a_type; + unsigned long a_val; +}; + +static const auxv* s_auxv = nullptr; + +volatile Kernel::API::SharedPage* g_shared_page = nullptr; + +__attribute__((constructor(101))) +static void _init_auxv() +{ + if (environ == nullptr) + return; + + const char* const* null_env = environ; + while (*null_env) + null_env++; + + s_auxv = reinterpret_cast(null_env + 1); + + if (auto value = getauxval(AT_SHARED_PAGE)) + g_shared_page = reinterpret_cast(value); +} + +unsigned long getauxval(unsigned long type) +{ + if (s_auxv == nullptr) + return 0; + for (const auxv* aux = s_auxv; aux->a_type != AT_NULL; aux++) + if (aux->a_type == type) + return aux->a_val; + return 0; +} diff --git a/userspace/libraries/LibC/unistd.cpp b/userspace/libraries/LibC/unistd.cpp index 8eaa0dcd..e216888d 100644 --- a/userspace/libraries/LibC/unistd.cpp +++ b/userspace/libraries/LibC/unistd.cpp @@ -2,12 +2,6 @@ #include #include -#include - -#include -#include -#include - #include #include #include @@ -19,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -36,7 +31,6 @@ struct init_funcs_t extern "C" char** environ; -volatile Kernel::API::SharedPage* g_shared_page = nullptr; #define DUMP_BACKTRACE 1 #define DEMANGLE_BACKTRACE 0 @@ -58,28 +52,11 @@ void __stack_chk_fail(void) { abort(); } static void __dump_backtrace(int, siginfo_t*, void*); -static LibELF::AuxiliaryVector* find_auxv(char** envp) -{ - if (envp == nullptr) - return nullptr; - - char** null_env = envp; - while (*null_env) - null_env++; - - return reinterpret_cast(null_env + 1); -} - extern "C" void _init_libc(char** environ, init_funcs_t init_funcs, init_funcs_t fini_funcs) { if (::environ == nullptr) ::environ = environ; - if (auto* auxv = find_auxv(environ)) - for (auto* aux = auxv; aux->a_type != LibELF::AT_NULL; aux++) - if (aux->a_type == LibELF::AT_SHARED_PAGE) - g_shared_page = static_cast(aux->a_un.a_ptr); - #if defined(__x86_64__) if (uthread* self = reinterpret_cast(syscall(SYS_GET_FSBASE))) #elif defined(__i686__) diff --git a/userspace/libraries/LibELF/include/LibELF/AuxiliaryVector.h b/userspace/libraries/LibELF/include/LibELF/AuxiliaryVector.h index 810f2b05..6ca24f49 100644 --- a/userspace/libraries/LibELF/include/LibELF/AuxiliaryVector.h +++ b/userspace/libraries/LibELF/include/LibELF/AuxiliaryVector.h @@ -27,6 +27,8 @@ namespace LibELF AT_BASE = 7, AT_SHARED_PAGE = 0xFFFF0001, + AT_STACK_BASE = 0xFFFF0002, + AT_STACK_SIZE = 0xFFFF0003, }; }