about summary refs log tree commit diff
path: root/sysdeps/arm/elf/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/arm/elf/start.S')
-rw-r--r--sysdeps/arm/elf/start.S22
1 files changed, 15 insertions, 7 deletions
diff --git a/sysdeps/arm/elf/start.S b/sysdeps/arm/elf/start.S
index 90a62f6d9a..13d4229b3b 100644
--- a/sysdeps/arm/elf/start.S
+++ b/sysdeps/arm/elf/start.S
@@ -45,26 +45,34 @@
 	.globl _start
 	.type _start,#function
 _start:
+	/* Fetch address of fini */
+	ldr ip, =__libc_csu_fini
+
 	/* Clear the frame pointer since this is the outermost frame.  */
 	mov fp, #0
 
 	/* Pop argc off the stack and save a pointer to argv */
-	ldmfd sp!, {a2}
+	ldr a2, [sp], #4
 	mov a3, sp
 
-	/* Push the last arguments to main() onto the stack */
-	stmfd sp!, {a1}
-	ldr a1, =__libc_csu_fini
-	stmfd sp!, {a1}
+	/* Push stack limit */
+	str a3, [sp, #-4]!
+
+	/* Push rtld_fini */
+	str a1, [sp, #-4]!
 
-	/* Set up the other arguments for main() that go in registers */
+	/* Set up the other arguments in registers */
 	ldr a1, =main
 	ldr a4, =__libc_csu_init
 
-	/* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */
+	/* Push fini */
+	str ip, [sp, #-4]!
+
+	/* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
 
 	/* Let the libc call main and exit with its return code.  */
 	bl __libc_start_main
+
 	/* should never get here....*/
 	bl abort