3912 crti needs to make sure _init and _fini are 16-byte stack aligned
[illumos-gate.git] / usr / src / lib / common / i386 / crti.s
blobaf177b83324c1201063f54d9ca277010fe25edc3
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
20 * CDDL HEADER END
23 * Copyright (c) 2001 by Sun Microsystems, Inc.
24 * All rights reserved.
27 * Copyright (c) 2013, Joyent, Inc. All rights reserved.
31 * These crt*.o modules are provided as the bare minimum required
32 * from a crt*.o for inclusion in building low level system
33 * libraries. The are only be to included in libraries which
34 * contain *no* C++ code and want to avoid the startup code
35 * that the C++ runtime has introduced into the crt*.o modules.
37 * For further details - see bug#4433015
40 .file "crti.s"
43 * Note that when _init and _fini are called we have 16-byte alignment per the
44 * ABI. We need to make sure that our asm leaves it such that subsequent calls
45 * will be aligned. gcc expects stack alignment before the call instruction is
46 * executed. Specifically if we call function foo(), the stack pointer will be
47 * 0xc aligned after executing the call instruction and before executing foo's
48 * prologue. Note that because 16-byte alignment also ensures 4-byte alignment
49 * we will not be breaking compatibility with older applications.
53 * _init function prologue
55 .section .init,"ax"
56 .globl _init
57 .type _init,@function
58 .align 16
59 _init:
60 pushl %ebp
61 movl %esp, %ebp
62 andl $-16,%esp
63 subl $12,%esp
64 pushl %ebx
65 call .L1
66 .L1: popl %ebx
67 addl $_GLOBAL_OFFSET_TABLE_+[.-.L1], %ebx
70 * _fini function prologue
72 .section .fini,"ax"
73 .globl _fini
74 .type _fini,@function
75 .align 16
76 _fini:
77 pushl %ebp
78 movl %esp, %ebp
79 andl $-16,%esp
80 subl $12,%esp
81 pushl %ebx
82 call .L2
83 .L2: popl %ebx
84 addl $_GLOBAL_OFFSET_TABLE_+[.-.L2], %ebx