| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | /* * Copyright (C) 2004-2007 Atmel Corporation * * This file is subject to the terms and conditions of the GNU Lesser General * Public License.  See the file "COPYING.LIB" in the main directory of this * archive for more details. * * When we enter _start, the stack looks like this: *	argc		argument counter *	argv[0]		pointer to program name *	argv[1..argc-1]	pointers to program args *	NULL *	env[0..N]	pointers to environment variables *	NULL * * r12 contains a function pointer to be registered with `atexit'. * This is how the dynamic linker arranges to have DT_FINI functions * called for shared libraries that have been loaded before this * code runs. * * We're going to call the following function: * __uClibc_main(int (*main)(int, char **, char **), int argc, *		 char **argv, void (*app_init)(void), void (*app_fini)(void), *		 void (*rtld_fini)(void), void *stack_end) * * So we need to set up things as follows: *	r12 = address of main *	r11 = argc *	r10 = &argv[0] *	r9  = address of _init *	r8  = address of _fini *	sp[0] = whatever we got passed in r12 */#include <features.h>	.text	.global _start	.type	_start, @function_start:	/* Clear the frame pointer and link register since this is the outermost frame.  */	mov	r7, 0	mov	lr, 0	ld.w	r11, sp++		/* argc		*/	mov	r10, sp			/* &argv[0]	*/	st.w	--sp, r10		/* stack_end */	st.w	--sp, r12		/* rtld_fini */#ifdef __PIC__	lddpc	r6, .L_GOT.L_RGOT:	rsub	r6, pc	lda.w	r9, _init	lda.w	r8, _fini	lda.w	r12, main	/* Ok, now run uClibc's main() -- should not return */	call	__uClibc_main	.align	2.L_GOT:	.long	.L_RGOT - _GLOBAL_OFFSET_TABLE_#else	lddpc	r9, __init_addr		/* app_init */	lddpc	r8, __fini_addr		/* app_fini */	lddpc	r12, __main_addr	/* main */	/* Ok, now run uClibc's main() -- should not return */	lddpc	pc, ___uClibc_main_addr	.align	2__init_addr:	.long	_init__fini_addr:	.long	_fini__main_addr:	.long	main___uClibc_main_addr:	.long	__uClibc_main#endif	.size	_start, . - _start	/*	 * The LSB says we need this.	 */	.section ".note.ABI-tag", "a"	.align	4	.long	2f - 1f		/* namesz */	.long	4f - 3f		/* descsz */	.long	1		/* type   */1:	.asciz	"GNU"		/* name */2:	.align	43:	.long	0		/* Linux executable */	.long	2,6,0		/* Earliest compatible kernel */4:	.align	4
 |