summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Kjellerstedt <peter.kjellerstedt@axis.com>2005-02-09 08:42:13 +0000
committerPeter Kjellerstedt <peter.kjellerstedt@axis.com>2005-02-09 08:42:13 +0000
commit439fc76c8d321d10018aad3a9a5d9562906c58ad (patch)
tree330775bad28c6ab360f420c84960329879b0139a
parent41d65c1c06be54140ec2b218c0c11a67305614fe (diff)
Implement _start completely in assembler. Otherwise the compiler will
push the frame pointer when DO_DEBUG is enabled (and thus incorrect argc, argv and envp will be passed to the program).
-rw-r--r--libc/sysdeps/linux/cris/crt0.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/libc/sysdeps/linux/cris/crt0.c b/libc/sysdeps/linux/cris/crt0.c
index 166d30b60..a676ee908 100644
--- a/libc/sysdeps/linux/cris/crt0.c
+++ b/libc/sysdeps/linux/cris/crt0.c
@@ -8,22 +8,26 @@ static void start1 (int argc, char **argv) __attribute__ ((used, noreturn));
/*
* It is important that this be the first function.
* This file is the first thing in the text section.
+ * This is implemented completely in assembler to avoid that the
+ * compiler pushes stuff on the stack (e.g. the frame pointer when
+ * debuging).
*/
-void
-_start (void)
-{
- /*
- * On the stack we have argc. We can calculate argv/envp
- * from that and the succeeding stack location, but fix so
- * we get the right calling convention (regs in r10/r11).
- *
- * Please view linux/fs/binfmt_elf.c for a complete
- * understanding of this.
- */
- __asm__ volatile("pop $r10");
- __asm__ volatile("move.d $sp, $r11");
- __asm__ volatile("jump start1");
-}
+
+/*
+ * On the stack we have argc. We can calculate argv/envp
+ * from that and the succeeding stack location, but fix so
+ * we get the right calling convention (regs in r10/r11).
+ *
+ * Please view linux/fs/binfmt_elf.c for a complete
+ * understanding of this.
+ */
+__asm__ ( \
+ ".text\n\t" \
+ ".global _start\n\t" \
+ "_start:\n\t" \
+ "pop $r10\n\t" \
+ "move.d $sp, $r11\n\t" \
+ "jump start1\n\t");
#include <features.h>