diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-11-29 14:14:27 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-11-29 14:14:27 +0000 |
commit | d6a72fff81fd3a9e042346d6e958aaf455e2447d (patch) | |
tree | f2cbd1289cd13e6043cc2d107baa9d12c8e31379 | |
parent | 2010-11-26 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-d6a72fff81fd3a9e042346d6e958aaf455e2447d.tar.bz2 |
2010-11-29 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libcsupport/src/newlibc_exit.c, score/src/threadhandler.c: Added
support for .preinit_array, .init_array and .fini_array sections.
-rw-r--r-- | cpukit/ChangeLog | 5 | ||||
-rw-r--r-- | cpukit/libcsupport/src/newlibc_exit.c | 23 | ||||
-rw-r--r-- | cpukit/score/src/threadhandler.c | 22 |
3 files changed, 47 insertions, 3 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index eafc3c2308..0b5f27c320 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,8 @@ +2010-11-29 Sebastian Huber <sebastian.huber@embedded-brains.de> + + * libcsupport/src/newlibc_exit.c, score/src/threadhandler.c: Added + support for .preinit_array, .init_array and .fini_array sections. + 2010-11-25 Sebastian Huber <sebastian.huber@embedded-brains.de> * sapi/include/confdefs.h, score/include/rtems/score/scheduler.h, diff --git a/cpukit/libcsupport/src/newlibc_exit.c b/cpukit/libcsupport/src/newlibc_exit.c index 818ba884f4..3cf602d62e 100644 --- a/cpukit/libcsupport/src/newlibc_exit.c +++ b/cpukit/libcsupport/src/newlibc_exit.c @@ -118,10 +118,13 @@ void libc_wrapup(void) */ #include <unistd.h> +#include <newlib.h> -/* FIXME: These defines are a blatant hack */ - #define EXIT_SYMBOL _exit +#if defined(HAVE_INITFINI_ARRAY) + extern void __libc_fini_array(void); +#endif +/* FIXME: These defines are a blatant hack */ #if defined(__AVR__) #undef __USE_INIT_FINI__ #endif @@ -135,8 +138,22 @@ void libc_wrapup(void) extern void FINI_SYMBOL( void ); #endif -void EXIT_SYMBOL(int status) +void _exit(int status) { + #if defined(HAVE_INITFINI_ARRAY) + /* + * According to + * + * System V Application Binary Interface + * Chapter 5 + * Initialization and Termination Functions + * + * we have to call the functions referenced by the .fini_array before the + * one referenced by the .fini section. + */ + __libc_fini_array(); + #endif + /* * If the toolset uses init/fini sections, then we need to * run the global destructors now. diff --git a/cpukit/score/src/threadhandler.c b/cpukit/score/src/threadhandler.c index 3fffd8fb83..2082bdfb78 100644 --- a/cpukit/score/src/threadhandler.c +++ b/cpukit/score/src/threadhandler.c @@ -30,6 +30,14 @@ #include <rtems/score/userext.h> #include <rtems/score/wkspace.h> +#if defined(RTEMS_NEWLIB) + #include <newlib.h> +#endif + +#if defined(HAVE_INITFINI_ARRAY) + extern void __libc_init_array(void); +#endif + #if defined(__AVR__) #undef __USE_INIT_FINI__ #endif @@ -138,6 +146,20 @@ void _Thread_Handler( void ) */ if (!doneCons) /* && (volatile void *)_init) */ { INIT_NAME (); + + #if defined(HAVE_INITFINI_ARRAY) + /* + * According to + * + * System V Application Binary Interface + * Chapter 5 + * Initialization and Termination Functions + * + * we have to call the functions referenced by the .init_array after + * the one referenced by the .init section. + */ + __libc_init_array(); + #endif } #endif |