diff options
| author | Kacper <kacper@mail.openlinux.dev> | 2025-12-15 18:24:54 +0100 |
|---|---|---|
| committer | Kacper <kacper@mail.openlinux.dev> | 2025-12-15 18:24:54 +0100 |
| commit | 69e6fe89fa9baafeca3e3515bb50897cd8ee7c35 (patch) | |
| tree | 489046ce167b8b20d205f87f4ae1f4b680c19b43 /lib/libc/internal/libc_main.c | |
| parent | 0d5bffe9d2caadc1215c875e560c52bca5161c54 (diff) | |
Add getauxval and cleanup libc startup
Diffstat (limited to 'lib/libc/internal/libc_main.c')
| -rw-r--r-- | lib/libc/internal/libc_main.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/libc/internal/libc_main.c b/lib/libc/internal/libc_main.c new file mode 100644 index 00000000..7ac15ab4 --- /dev/null +++ b/lib/libc/internal/libc_main.c @@ -0,0 +1,40 @@ +#include <libc.h> +#include <stddef.h> +#include <stdint.h> +#include <stdlib.h> +#include <sys/cdefs.h> + +extern void __init_vdso(void); + +struct libc __libc; +char **environ; +char *__progname; + +extern int main(int, char **, char **); + +__used void __libc_main(uintptr_t *rsp) +{ + char **argv; + size_t *auxv; + int argc; + + argc = (int)(*rsp); + argv = (char **)(++rsp); + + rsp += argc; + + environ = (char **)(++rsp); + __progname = argv[0]; + + while (*rsp) + rsp++; + + auxv = (size_t *)++rsp; + + for (size_t i = 0; auxv[i]; i += 2) + __libc.auxv[auxv[i]] = auxv[i + 1]; + + __init_vdso(); + + exit(main(argc, argv, environ)); +} |
