| /* |
| * __static_init.c |
| * |
| * This function takes the raw data block set up by the ELF loader |
| * in the kernel and parses it. It is invoked by crt0.S which makes |
| * any necessary adjustments and passes calls this function using |
| * the standard C calling convention. |
| * |
| * The arguments are: |
| * uintptr_t *elfdata -- The ELF loader data block; usually from the stack. |
| * Basically a pointer to argc. |
| * void (*onexit)(void) -- Function to install into onexit |
| */ |
| |
| #include <stddef.h> |
| #include <stdlib.h> |
| #include <stdint.h> |
| #include <klibc/compiler.h> |
| #include <elf.h> |
| |
| char **environ; |
| |
| extern int main(int, char **, char **); |
| |
| __noreturn __libc_init(uintptr_t *elfdata, void (*onexit)(void)) |
| { |
| int argc; |
| char **argv, **envp; |
| |
| (void)onexit; /* For now, we ignore this... */ |
| |
| argc = (int)*elfdata++; |
| argv = (char **)elfdata; |
| envp = argv+(argc+1); |
| |
| environ = envp; |
| exit(main(argc, argv, envp)); |
| } |
| |
| |