summaryrefslogtreecommitdiff
path: root/libddekit/initcall.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-02-19 06:14:24 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-02-19 06:14:24 +0000
commit6fafeb146e9efd59140ea58cebd7dd38ae9a6379 (patch)
tree7db89ba6a28932514b105d620bba4884ec332ec3 /libddekit/initcall.c
parent38c2c2458e3f4ecb329ff35621806252aac209b9 (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++;
+ }
+}
+