X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fcrt0.o_src%2Fcrt0.c;h=3cdbe119df16cb2fe37bd203fc2a95ec876f442e;hb=038439147795891da9d99ddbc10ebbbb0d9fca09;hp=7c0e3ff9f6b4c4590806bca6d01a2ff8101a29df;hpb=fb6e2db49eccb97eff2d27b00bdbecb2d3c50b92;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/crt0.o_src/crt0.c b/Usermode/Libraries/crt0.o_src/crt0.c index 7c0e3ff9..3cdbe119 100644 --- a/Usermode/Libraries/crt0.o_src/crt0.c +++ b/Usermode/Libraries/crt0.o_src/crt0.c @@ -6,21 +6,28 @@ typedef void (*exithandler_t)(void); typedef void (*constructor_t)(void); +constructor_t _crtbegin_ctors[0] __attribute__((section(".ctors"))); + exithandler_t _crt0_exit_handler; -extern constructor_t _crtbegin_ctors[]; +extern void _init(void); +extern void _fini(void); +extern void _exit(int status) __attribute__((noreturn)); +extern int main(int argc, char *argv[], char **envp); + +void _start(int argc, char *argv[], char **envp) __attribute__ ((alias("start"))); -int start(int argc, char *argv[], char **envp) +void start(int argc, char *argv[], char **envp) { - int i; - int rv; - - for( i = 0; _crtbegin_ctors[i]; i ++ ) + // TODO: isn't this handled by _init? + for( int i = 0; _crtbegin_ctors[i]; i ++ ) _crtbegin_ctors[i](); + + _init(); - rv = main(argc, argv, envp); + int rv = main(argc, argv, envp); if( _crt0_exit_handler ) _crt0_exit_handler(); - - return rv; + _fini(); + _exit(rv); }