diff options
Diffstat (limited to 'sys/rt/boot.c')
-rw-r--r-- | sys/rt/boot.c | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/sys/rt/boot.c b/sys/rt/boot.c index 197e861..76f5599 100644 --- a/sys/rt/boot.c +++ b/sys/rt/boot.c @@ -1,34 +1,41 @@ +#include <u.h> #include <rt.h> +#include <elf.h> -int -rt·boot( - int (*main)(int,char **,char **), int argc, char **argv, - int (*init)(int, char **, char **), void (*fini)(void), - void (*exit)(void) -) +/* tell linker to go find */ +int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv); + +#define NAUX 38 +static void +rt·init(char **env, char *program) { - char **envp = argv+argc+1; - rt·environ = envp; + uintptr i, *auxv, aux[NAUX]; + for(i=0; env[i]; i++) + ; + rt·context.auxv = auxv = (void *)(env+i+1); + for(i=0; auxv[i]; i+=2) + if(auxv[i]<NAUX) + aux[auxv[i]] = auxv[i+1]; - if(exit) - rt·context.exit = exit; + rt·context.sysinfo = aux[AT_SYSINFO]; + rt·context.pagesize = aux[AT_PAGESZ]; +} - if(fini) - rt·context.fini = fini; +int +rt·boot(int (*main)(), int argc, char **argv, void (*init)(), void (*fini)(), void (*exit)()) +{ + char **env = argv+argc+1; + rt·init(env, argv[0]); - if(init){ - rt·context.init = init; - init(argc, argv, envp); - } + /* ring libc, anyone home? */ + __libc_start_main(main, argc, argv); - /* XXX: - * we could call __libc_start_main of musl here: - * this would give us the normal C runtime along with ours - * which would allow seamless linking to other libraries - * or we can implement a compatibility layer - */ - rt·exit(main(argc, argv, envp)); + /* no? ok we continue on if there is no libc linked */ + init(); + if(fini) + rt·context.fini = fini; + if(exit) + rt·context.exit = exit; - /* should never get here */ - return 0; + rt·exit(main(argc, argv, env)); } |