From 69e6fe89fa9baafeca3e3515bb50897cd8ee7c35 Mon Sep 17 00:00:00 2001 From: Kacper Date: Mon, 15 Dec 2025 18:24:54 +0100 Subject: Add getauxval and cleanup libc startup --- include/arch/x86_64/asm/vdso.h | 18 +++++++-- include/elf.h | 85 ++++++++++++++++++++++++++++++++++++++++-- include/sys/auxv.h | 6 +++ include/sys/cdefs.h | 1 + 4 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 include/sys/auxv.h (limited to 'include') diff --git a/include/arch/x86_64/asm/vdso.h b/include/arch/x86_64/asm/vdso.h index 8a79d3a2..7f0ea2aa 100644 --- a/include/arch/x86_64/asm/vdso.h +++ b/include/arch/x86_64/asm/vdso.h @@ -3,8 +3,20 @@ struct timespec; -extern int (*__vdso_clock_gettime)(int, struct timespec *); -extern int (*__vdso_getcpu)(unsigned *, unsigned *, void *); -extern int (*__vdso_time)(long *); +#define __VDSO_CLOCK_GETTIME +#define __VDSO_GETCPU +#define __VDSO_TIME + +static int (*__vdso_clock_gettime)(int, struct timespec *) = 0; +static int (*__vdso_getcpu)(unsigned *, unsigned *, void *) = 0; +static int (*__vdso_time)(long *) = 0; + +struct { + const char *name; + void *func; +} __vdso_symtab[] = { { "__vdso_clock_gettime", (void *)&__vdso_clock_gettime }, + { "__vdso_getcpu", (void *)&__vdso_getcpu }, + { "__vdso_time", (void *)&__vdso_time }, + { 0, 0 } }; #endif diff --git a/include/elf.h b/include/elf.h index e4aa7c88..8317c9ca 100644 --- a/include/elf.h +++ b/include/elf.h @@ -3,6 +3,12 @@ #include +#define ELF32_ST_BIND(val) (((unsigned char)(val)) >> 4) +#define ELF32_ST_TYPE(val) ((val) & 0xf) + +#define ELF64_ST_BIND(val) ELF32_ST_BIND(val) +#define ELF64_ST_TYPE(val) ELF32_ST_TYPE(val) + #define PT_NULL 0 #define PT_LOAD 1 #define PT_DYNAMIC 2 @@ -140,6 +146,69 @@ #define ELFOSABI_NONE 0 #define ELFOSABI_LINUX 3 +#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_FLAGS 8 +#define AT_ENTRY 9 +#define AT_NOTELF 10 +#define AT_UID 11 +#define AT_EUID 12 +#define AT_GID 13 +#define AT_EGID 14 +#define AT_CLKTCK 17 + +#define AT_PLATFORM 15 +#define AT_HWCAP 16 + +#define AT_FPUCW 18 + +#define AT_DCACHEBSIZE 19 +#define AT_ICACHEBSIZE 20 +#define AT_UCACHEBSIZE 21 + +#define AT_IGNOREPPC 22 + +#define AT_SECURE 23 + +#define AT_BASE_PLATFORM 24 + +#define AT_RANDOM 25 + +#define AT_HWCAP2 26 + +#define AT_RSEQ_FEATURE_SIZE 27 +#define AT_RSEQ_ALIGN 28 + +#define AT_HWCAP3 29 +#define AT_HWCAP4 30 + +#define AT_EXECFN 31 + +#define AT_SYSINFO 32 +#define AT_SYSINFO_EHDR 33 + +#define AT_L1I_CACHESHAPE 34 +#define AT_L1D_CACHESHAPE 35 +#define AT_L2_CACHESHAPE 36 +#define AT_L3_CACHESHAPE 37 + +#define AT_L1I_CACHESIZE 40 +#define AT_L1I_CACHEGEOMETRY 41 +#define AT_L1D_CACHESIZE 42 +#define AT_L1D_CACHEGEOMETRY 43 +#define AT_L2_CACHESIZE 44 +#define AT_L2_CACHEGEOMETRY 45 +#define AT_L3_CACHESIZE 46 +#define AT_L3_CACHEGEOMETRY 47 + +#define AT_MINSIGSTKSZ 51 + typedef uint16_t Elf32_Half; typedef int16_t Elf32_SHalf; typedef uint32_t Elf32_Word; @@ -318,10 +387,18 @@ typedef struct elf64_note { Elf64_Word n_type; } Elf64_Nhdr; -#define ELF32_ST_BIND(val) (((unsigned char)(val)) >> 4) -#define ELF32_ST_TYPE(val) ((val) & 0xf) +typedef struct { + uint32_t a_type; + union { + uint32_t a_val; + } a_un; +} Elf32_auxv_t; -#define ELF64_ST_BIND(val) ELF32_ST_BIND(val) -#define ELF64_ST_TYPE(val) ELF32_ST_TYPE(val) +typedef struct { + uint64_t a_type; + union { + uint64_t a_val; + } a_un; +} Elf64_auxv_t; #endif diff --git a/include/sys/auxv.h b/include/sys/auxv.h new file mode 100644 index 00000000..e3b65b99 --- /dev/null +++ b/include/sys/auxv.h @@ -0,0 +1,6 @@ +#ifndef __SYS_AUXV_H +#define __SYS_AUXV_H + +unsigned long getauxval(unsigned long); + +#endif diff --git a/include/sys/cdefs.h b/include/sys/cdefs.h index 70ace705..00e85014 100644 --- a/include/sys/cdefs.h +++ b/include/sys/cdefs.h @@ -18,6 +18,7 @@ #define __pure __attribute__((__pure__)) #define __nodiscard __attribute__((__warn_unused_result__)) #define __weak __attribute__((__weak__)) +#define __naked __attribute__((__naked__)) #define __predict_true(exp) __builtin_expect((exp) != 0, 1) #define __predict_false(exp) __builtin_expect((exp) != 0, 0) -- cgit v1.2.3