|
@@ -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>
|
|
|
|