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 dynamically-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# the .ctors section contains a list of pointers to "constructor" 72# functions that need to be called in order during C library initialization, 73# just before the program is being run. This is a C++ requirement 74# 75# the last entry shall be 0, and is defined in crtend.S 76# 77 .section .preinit_array, "aw" 78 .globl __PREINIT_ARRAY__ 79__PREINIT_ARRAY__: 80 .long -1 81 82 .section .init_array, "aw" 83 .globl __INIT_ARRAY__ 84__INIT_ARRAY__: 85 .long -1 86 87 .section .fini_array, "aw" 88 .globl __FINI_ARRAY__ 89__FINI_ARRAY__: 90 .long -1 91 92 .section .ctors, "aw" 93 .globl __CTOR_LIST__ 94__CTOR_LIST__: 95 .long -1 96 97#include "__dso_handle.S" 98