Browse Source

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).

Peter Kjellerstedt 20 years ago
parent
commit
439fc76c8d
1 changed files with 19 additions and 15 deletions
  1. 19 15
      libc/sysdeps/linux/cris/crt0.c

+ 19 - 15
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.
  * It is important that this be the first function.
  * This file is the first thing in the text section.  
  * 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
-	 * On the stack we have argc. We can calculate argv/envp
+ * we get the right calling convention (regs in r10/r11).
-	 * 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.
-	 * Please view linux/fs/binfmt_elf.c for a complete
+ */
-	 * understanding of this.
+__asm__ ( \
-	 */
+          ".text\n\t" \
-	__asm__ volatile("pop $r10");
+          ".global _start\n\t" \
-	__asm__ volatile("move.d $sp, $r11");
+          "_start:\n\t" \
-	__asm__ volatile("jump start1");
+          "pop $r10\n\t" \
-}
+          "move.d $sp, $r11\n\t" \
+          "jump start1\n\t");
 
 
 #include <features.h>
 #include <features.h>