aboutsummaryrefslogtreecommitdiff
path: root/libgloss/arm/linux-crt0.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/arm/linux-crt0.c')
-rw-r--r--libgloss/arm/linux-crt0.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/libgloss/arm/linux-crt0.c b/libgloss/arm/linux-crt0.c
new file mode 100644
index 0000000..29f317f
--- /dev/null
+++ b/libgloss/arm/linux-crt0.c
@@ -0,0 +1,39 @@
+/** Linux startup code for the ARM processor.
+ * Written by Shaun Jackman <sjackman@gmail.com>.
+ * Copyright 2006 Pathway Connectivity
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * is freely granted, provided that this notice is preserved.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+
+static int _main(int argc, char *argv[]) __attribute__((noreturn));
+
+#if __thumb__
+asm("\n"
+ ".code 32\n"
+ ".global _start\n"
+ ".type _start, %function\n"
+ "_start:\n"
+ "\tadr r0, _start_thumb+1\n"
+ "\tbx r0\n"
+ ".size _start, .-_start\n");
+
+__attribute__((naked, used))
+static void _start_thumb(void)
+#else
+__attribute__((naked))
+void _start(void)
+#endif
+{
+ register int *sp asm("sp");
+ _main(*sp, (char **)(sp + 1));
+}
+
+static int _main(int argc, char *argv[])
+{
+ environ = argv + argc + 1;
+ exit(main(argc, argv, environ));
+}