/* libc/sys/linux/crt0.c - Run-time initialization */ /* FIXME: This should be rewritten in assembler and placed in a subdirectory specific to a platform. There should also be calls to run constructors. */ /* Written 2000 by Werner Almesberger */ #include #include #include extern char **environ; extern int main(int argc,char **argv,char **envp); extern char _end; extern char __bss_start; void _start(int args) { /* * The argument block begins above the current stack frame, because we * have no return address. The calculation assumes that sizeof(int) == * sizeof(void *). This is okay for i386 user space, but may be invalid in * other cases. */ int *params = &args-1; int argc = *params; char **argv = (char **) (params+1); environ = argv+argc+1; /* Note: do not clear the .bss section. When running with shared * libraries, certain data items such __mb_cur_max or environ * may get placed in the .bss, even though they are initialized * to non-zero values. Clearing the .bss will end up zeroing * out their initial values. The .bss is already initialized * by this time by Linux. */ tzset(); /* initialize timezone info */ exit(main(argc,argv,environ)); }