From 75b2a820de595b1a627096a58a01e906a73c9158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sun, 12 Jan 2003 17:22:45 +0000 Subject: [PATCH] Updated to be a bit more BeOS compatible (now calls B_INIT_BEFORE/AFTER_FUNCTION_NAME instead of "INIT_BEFORE/AFTER_CTORS". Uses the new runtime linker exports. Note, this is not yet BeOS compatible (will need to have init/fini sections)! git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2441 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/glue/crt0.c | 22 +++++++++++++--------- src/kernel/glue/lib0.c | 29 +++++++++++++++++------------ 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/kernel/glue/crt0.c b/src/kernel/glue/crt0.c index 9c70518266..2ced87a515 100755 --- a/src/kernel/glue/crt0.c +++ b/src/kernel/glue/crt0.c @@ -17,7 +17,7 @@ extern void (*__ctor_end)(void); extern int main(int argc,char **argv); -int _start(struct uspace_prog_args_t *); +int _start(struct uspace_program_args *); void _call_ctors(void); static char empty[1]; @@ -25,7 +25,9 @@ char *__progname = empty; char **environ = NULL; -int _start(struct uspace_prog_args_t *uspa) + +int +_start(struct uspace_program_args *args) { int retcode; register char *ap; @@ -33,27 +35,29 @@ int _start(struct uspace_prog_args_t *uspa) // __stdio_init(); - if ((ap = uspa->argv[0])) { + if ((ap = args->argv[0])) { if ((__progname = strrchr(ap, '/')) == NULL) __progname = ap; else ++__progname; } - - environ = uspa->envp; - - retcode = main(uspa->argc, uspa->argv); + + environ = args->envp; + retcode = main(args->argc, args->argv); // __stdio_deinit(); + sys_exit(retcode); return 0; } -void _call_ctors(void) + +void +_call_ctors(void) { void (**f)(void); - for(f = &__ctor_list; f < &__ctor_end; f++) { + for (f = &__ctor_list; f < &__ctor_end; f++) { (**f)(); } } diff --git a/src/kernel/glue/lib0.c b/src/kernel/glue/lib0.c index a7100548a5..24e5804d2b 100755 --- a/src/kernel/glue/lib0.c +++ b/src/kernel/glue/lib0.c @@ -4,39 +4,44 @@ ** Distributed under the terms of the NewOS License. */ + #include +#include #include + extern void sys_exit(int retcode); extern void (*__ctor_list)(void); extern void (*__ctor_end)(void); -int _start(unsigned image_id, struct uspace_prog_args_t *); +int _start(image_id image_id, struct uspace_program_args *); static void _call_ctors(void); + int -_start(unsigned imid, struct uspace_prog_args_t *uspa) +_start(image_id imageID, struct uspace_program_args *args) { // int i; // int retcode; - void *ibc; - void *iac; + void *initBefore = NULL; + void *initAfter = NULL; - ibc= uspa->rld_export->dl_sym(imid, "INIT_BEFORE_CTORS", 0); - iac= uspa->rld_export->dl_sym(imid, "INIT_AFTER_CTORS", 0); + args->rld_export->get_image_symbol(imageID, B_INIT_BEFORE_FUNCTION_NAME, B_SYMBOL_TYPE_TEXT, (void **)&initBefore); + args->rld_export->get_image_symbol(imageID, B_INIT_AFTER_FUNCTION_NAME, B_SYMBOL_TYPE_TEXT, (void **)&initAfter); + + if (initBefore) + ((libinit_f *)(initBefore))(imageID, args); - if(ibc) { - ((libinit_f*)(ibc))(imid, uspa); - } _call_ctors(); - if(iac) { - ((libinit_f*)(iac))(imid, uspa); - } + + if (initAfter) + ((libinit_f *)(initAfter))(imageID, args); return 0; } + static void _call_ctors(void) {