1/*
2 * Copyright (C) 2009-2010 The Android Open Source Project
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 *  * Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 *  * Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in
12 *    the documentation and/or other materials provided with the
13 *    distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28.text
29.align  4
30.type   _start,#function
31.globl  _start
32
33# this is the small startup code that is first run when
34# any executable that is statically-linked with Bionic
35# runs.
36#
37# it's purpose is to call __libc_init with appropriate
38# arguments, which are:
39#
40#    - the address of the raw data block setup by the Linux
41#      kernel ELF loader
42#
43#    - address of an "onexit" function, not used on any
44#      platform supported by Bionic
45#
46#    - address of the "main" function of the program. We
47#      can't hard-code it in the adr pseudo instruction
48#      so we use a tiny trampoline that will get relocated
49#      by the dynamic linker before this code runs
50#
51#    - address of the constructor list
52#
53_start:
54    mov     r15, r4
55    mov     #0, r5
56    mov.l   0f, r6
57    mova    2f, r0
58    mov     r0, r7
59    mov.l   1f, r0
60    jmp     @r0
61    nop
62
63    .balign 4
640:  .long   main
651:  .long   __libc_init
662:  .long   __PREINIT_ARRAY__
67    .long   __INIT_ARRAY__
68    .long   __FINI_ARRAY__
69    .long   __CTOR_LIST__
70
71    .section .preinit_array, "aw"
72    .globl __PREINIT_ARRAY__
73__PREINIT_ARRAY__:
74    .long -1
75
76    .section .init_array, "aw"
77    .globl __INIT_ARRAY__
78__INIT_ARRAY__:
79    .long -1
80
81    .section .fini_array, "aw"
82    .globl __FINI_ARRAY__
83__FINI_ARRAY__:
84    .long -1
85
86    .section .ctors, "aw"
87    .globl __CTOR_LIST__
88__CTOR_LIST__:
89    .long -1
90
91#include "__dso_handle.S"
92