summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-11-29 14:14:27 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-11-29 14:14:27 +0000
commitd6a72fff81fd3a9e042346d6e958aaf455e2447d (patch)
treef2cbd1289cd13e6043cc2d107baa9d12c8e31379 /cpukit
parent2010-11-26 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-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.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/ChangeLog5
-rw-r--r--cpukit/libcsupport/src/newlibc_exit.c23
-rw-r--r--cpukit/score/src/threadhandler.c22
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