summaryrefslogtreecommitdiff
path: root/libddekit/initcall.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-02-19 05:56:38 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-02-19 05:56:38 +0100
commit19796a75ab8ba43b31e230ea169d5383c6392bfc (patch)
tree3041c5678e06133dd7fcbf2ebf34b6506334f677 /libddekit/initcall.c
parent6b2e5e0d91823c2a6ce5a5cb12ae3d00b82adae7 (diff)
parent8df772b3c665e663f6f9d2a70f9c691590bd3f91 (diff)
Merge branch 'dde' into upstream-merged
Diffstat (limited to 'libddekit/initcall.c')
-rw-r--r--libddekit/initcall.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/libddekit/initcall.c b/libddekit/initcall.c
new file mode 100644
index 00000000..9195243d
--- /dev/null
+++ b/libddekit/initcall.c
@@ -0,0 +1,27 @@
+#include <ddekit/initcall.h>
+
+#define BEG { (crt0_hook) ~1U }
+#define END { (crt0_hook) 0 }
+
+#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ >= 4
+#define SECTION(x) __attribute__((used, section( x )))
+#else
+#define SECTION(x) __attribute__((section( x )))
+#endif
+
+typedef void (*crt0_hook)(void);
+
+static crt0_hook __L4DDE_CTOR_BEG__[1] SECTION(".mark_beg_l4dde_ctors") = BEG;
+static crt0_hook __l4DDE_CTOR_END__[1] SECTION(".mark_end_l4dde_ctors") = END;
+
+void ddekit_do_initcalls() {
+ crt0_hook *list = __L4DDE_CTOR_BEG__;
+
+ list++;
+ while (*list)
+ {
+ (**list)();
+ list++;
+ }
+}
+