summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/nios/crtend.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/nios/crtend.c')
-rw-r--r--libc/sysdeps/linux/nios/crtend.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/nios/crtend.c b/libc/sysdeps/linux/nios/crtend.c
new file mode 100644
index 000000000..26af229af
--- /dev/null
+++ b/libc/sysdeps/linux/nios/crtend.c
@@ -0,0 +1,43 @@
+#include <errno.h>
+#include <stdlib.h>
+/*
+static void (*__CTOR_END__[1]) __P((void))
+ __attribute__((section(".ctors"))) = { (void *)-1 };
+
+static void (*__DTOR_END__[1]) __P((void))
+ __attribute__((__unused__))
+ __attribute__((section(".dtors"))) = { (void *)0 };
+*/
+extern void (*__CTOR_END__[]) __P((void));
+static void __do_global_ctors_aux __P((void));
+
+static void
+__do_global_ctors_aux()
+{
+ void (**p)(void) = __CTOR_END__ - 1;
+
+ while (*p)
+ (**p--)();
+}
+
+static void dummy_init(void) __attribute__((section(".trash")));
+
+void
+dummy_init(void)
+{
+ static int initialized = 0;
+ static void (*volatile call__ctors)(void) = __do_global_ctors_aux;
+ /*
+ * Call global constructors.
+ * Arrange to call global destructors at exit.
+ */
+ /* prevent function pointer constant propagation */
+ __asm__ __volatile__ (".section .init");
+
+ if (!initialized) {
+ initialized = 1;
+ (*call__ctors)();
+ }
+ __asm__ __volatile__ (".section .trash");
+
+} \ No newline at end of file