2006-01-12 Roland McGrath <roland@redhat.com>
[glibc-ports.git] / sysdeps / hppa / elf / start.S
blob94edeaa212b41be317da7decf868a9f2b88071a7
1 /* ELF startup code for HPPA.
2    Copyright (C) 2002 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    In addition to the permissions in the GNU Lesser General Public
11    License, the Free Software Foundation gives you unlimited
12    permission to link the compiled version of this file with other
13    programs, and to distribute those programs without any restriction
14    coming from the use of this file. (The GNU Lesser General Public
15    License restrictions do apply in other respects; for example, they
16    cover modification of the file, and distribution when not linked
17    into another program.)
19    Note that people who make modified versions of this file are not
20    obligated to grant this special exception for their modified
21    versions; it is their choice whether to do so. The GNU Lesser
22    General Public License gives permission to release a modified
23    version without this exception; this exception also makes it
24    possible to release a modified version which carries forward this
25    exception.
27    The GNU C Library is distributed in the hope that it will be useful,
28    but WITHOUT ANY WARRANTY; without even the implied warranty of
29    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
30    Lesser General Public License for more details.
32    You should have received a copy of the GNU Lesser General Public
33    License along with the GNU C Library; if not, write to the Free
34    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
35    02111-1307 USA.  */
37         .import main, code
38         .import $global$, data
39         .import __libc_start_main, code
40         .import __libc_csu_fini, code
41         .import __libc_csu_init, code
43         /* Have the linker create plabel words
44            so we get PLABEL32 relocs and not 21/14 */
45         .section        .rodata
46         .align 4
47 .Lpmain:
48         .word P%main
49 .Lp__libc_start_main:
50         .word P%__libc_start_main
51 .Lp__libc_csu_fini:
52         .word P%__libc_csu_fini
53 .Lp__libc_csu_init:
54         .word P%__libc_csu_init
56         .text
57         .align 4
58         .globl _start
59         .export _start, ENTRY
60         .type _start,@function
61 _start:
63         .proc
64         .callinfo
66         /* Expand the stack to store the 5th through 7th args */
67         ldo     64(%sp), %sp
68         /* TODO: Follow ABI? Place more things on the stack here... */
70 #if SHARED
71         /* load main (1st argument) */
72         addil   LR'.Lpmain, %r19
73         ldw     RR'.Lpmain(%r1), %r26
74         ldw     0(%r26),%r26
75         /* argc and argv should be in 25 and 24 (2nd and 3rd argument) */
76         /* void (*init) (void) (4th argument) */
77         addil   LR'.Lp__libc_csu_init, %r19
78         ldw     RR'.Lp__libc_csu_init(%r1), %r23
79         ldw     0(%r23), %r23
80         /* void (*fini) (void) (5th argument) */
81         addil   LR'.Lp__libc_csu_fini, %r19
82         ldw     RR'.Lp__libc_csu_fini(%r1), %r22
83         ldw     0(%r22), %r22
84 #else
85         /* load main (1st argument) */
86         ldil    LR'.Lpmain, %r26
87         ldw     RR'.Lpmain(%r26), %r26
88         /* argc and argv should be in 25 and 24 (2nd and 3rd argument) */
89         /* void (*init) (void) (4th argument) */
90         ldil    LR'.Lp__libc_csu_init, %r23
91         ldw     RR'.Lp__libc_csu_init(%r23), %r23
92         /* void (*fini) (void) (5th argument) */
93         ldil    LR'.Lp__libc_csu_fini, %r22
94         ldw     RR'.Lp__libc_csu_fini(%r22), %r22
95 #endif
96         /* Store 5th argument */
97         stw     %r22, -52(%sp)
98         /* void (*rtld_fini) (void) (6th argument) */
99         stw     %r23, -56(%sp)
100         /* void *stack_end (7th argument) */
101         stw     %sp, -60(%sp)
103         /* load global */
104         ldil    L%$global$, %dp
105         ldo     R%$global$(%dp), %dp
107         bl      __libc_start_main,%r2
108         nop
109         /* die horribly if it returned (it shouldn't) */
110         iitlbp %r0,(%sr0,%r0)
111         nop
113         .procend
115 /* Define a symbol for the first piece of initialized data.  */
116         .data
117         .globl __data_start
118 __data_start:
119         .long 0
120         .weak data_start
121         data_start = __data_start