diff options
Diffstat (limited to 'lib/libc/src/main.c')
-rw-r--r-- | lib/libc/src/main.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/lib/libc/src/main.c b/lib/libc/src/main.c index 1154b21..02a648b 100644 --- a/lib/libc/src/main.c +++ b/lib/libc/src/main.c @@ -27,13 +27,55 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <sys/exec.h> #include <stdint.h> #include <stddef.h> +extern int __libc_stdio_init(void); +extern int __malloc_mem_init(void); +uint64_t __libc_auxv[_AT_MAX]; + int main(int argc, char **argv); +struct auxv_entry { + uint64_t tag; + uint64_t val; +}; + int __libc_entry(uint64_t *ctx) { - return main(0, NULL); + const struct auxv_entry *auxvp; + int status; + uint64_t argc, envc, tag; + char **argv; + char **envp; + + argc = *ctx; + argv = (char **)(ctx + 1); + envp = (char **)(argv + argc + 1); + + envc = 0; + while (envp[envc] != NULL) { + ++envc; + } + + auxvp = (void *)(envp + envc + 1); + for (int i = 0; i < _AT_MAX; ++i) { + if (auxvp->tag == AT_NULL) { + break; + } + if (auxvp->tag < _AT_MAX) { + __libc_auxv[auxvp->tag] = auxvp->val; + } + + ++auxvp; + } + + if ((status = __libc_stdio_init()) != 0) { + return status; + } + + __malloc_mem_init(); + return main(argc, argv); } |