summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/nios/crtbegin.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/nios/crtbegin.c')
-rw-r--r--libc/sysdeps/linux/nios/crtbegin.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/nios/crtbegin.c b/libc/sysdeps/linux/nios/crtbegin.c
new file mode 100644
index 000000000..c52999027
--- /dev/null
+++ b/libc/sysdeps/linux/nios/crtbegin.c
@@ -0,0 +1,37 @@
+#include <errno.h>
+#include <stdlib.h>
+/*
+static void (*__CTOR_LIST__[1]) __P((void))
+ __attribute__((__unused__))
+ __attribute__((section(".ctors"))) = { (void *)0 };
+
+static void (*__DTOR_LIST__[1]) __P((void))
+ __attribute__((section(".dtors"))) = { (void *)-1 };
+*/
+extern void (*__DTOR_LIST__[]) __P((void));
+static void __do_global_dtors_aux __P((void));
+
+static void
+__do_global_dtors_aux()
+{
+ void (**p)(void) = __DTOR_LIST__ + 1;
+
+ while (*p)
+ (**p++)();
+}
+
+static void dummy_fini(void) __attribute__((section(".trash")));
+
+void
+dummy_fini(void)
+{
+ static void (* volatile call__dtors)(void) = __do_global_dtors_aux;
+ /*
+ * Call global destructors.
+ */
+ /* prevent function pointer constant propagation */
+ __asm__ __volatile__ (".section .fini");
+ (*call__dtors)();
+ __asm__ __volatile__ (".section .trash");
+
+}