xref: /freebsd/lib/csu/i386/crt1_s.S (revision 7ef62cebc2f965b0f640263e179276928885e33d)
1/*-
2 * Copyright 2009 Konstantin Belousov.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 *
11 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
12 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
13 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
14 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
15 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
17 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
18 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
19 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
20 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
21 *
22 * $FreeBSD$
23 */
24
25#include <machine/asm.h>
26__FBSDID("$FreeBSD$");
27
28	.text
29	.align	4
30	.globl	_start
31	.type	_start, @function
32_start:
33	.cfi_startproc
34	.cfi_undefined %eip
35	popl	%esi		# Pop argc
36	.cfi_def_cfa_offset -4
37	movl	%esp,%edi	# argv starts at stack top
38	xorl	%ebp,%ebp
39	pushl	%ebp
40	.cfi_def_cfa_offset 0
41	movl	%esp,%ebp
42	.cfi_offset %ebp,-4
43	.cfi_def_cfa_register %ebp
44	andl	$0xfffffff0,%esp # align stack
45
46#ifdef GCRT
47	subl	$4,%esp		# Align stack for 7 arguments
48	pushl	$etext
49	pushl	$eprol
50eprol:
51#else
52	subl	$12,%esp	# Align stack for 5 arguments
53#endif /* GCRT */
54
55#ifdef PIC
56	calll	1f
571:	popl	%ebx
58	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b],%ebx
59	leal	main@GOTOFF(%ebx),%eax
60	pushl	%eax
61#else
62	pushl	$main
63#endif /* PIC */
64
65	pushl	%edx		# rtld cleanup
66	/* env = argv + argc + 1 */
67	movl	%edi,%eax	# env = argv
68	movl	%esi,%ecx
69	shll	$2,%ecx		# argc * 4
70	addl	%ecx,%eax	# env += argc
71	addl	$4,%eax		# env += 1
72	pushl	%eax		# env
73	pushl	%edi		# argv
74	pushl	%esi		# argc
75
76#ifdef GCRT
77	/*
78	 * __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
79	 */
80	calll	__libc_start1_gcrt
81#else
82	/*
83	 * __libc_start1(argc, argv, env, cleanup, main);
84	 */
85#ifdef PIC
86	calll	__libc_start1@PLT
87#else
88	calll	__libc_start1
89#endif
90#endif /* GCRT */
91	int3
92	.cfi_endproc
93	.size	_start, . - _start
94
95	.section .note.GNU-stack,"",%progbits
96