|  | /* ELF startup code for HPPA. | 
|  | Copyright (C) 2002-2016 Free Software Foundation, Inc. | 
|  | This file is part of the GNU C Library. | 
|  |  | 
|  | The GNU C Library is free software; you can redistribute it and/or | 
|  | modify it under the terms of the GNU Lesser General Public | 
|  | License as published by the Free Software Foundation; either | 
|  | version 2.1 of the License, or (at your option) any later version. | 
|  |  | 
|  | In addition to the permissions in the GNU Lesser General Public | 
|  | License, the Free Software Foundation gives you unlimited | 
|  | permission to link the compiled version of this file with other | 
|  | programs, and to distribute those programs without any restriction | 
|  | coming from the use of this file. (The GNU Lesser General Public | 
|  | License restrictions do apply in other respects; for example, they | 
|  | cover modification of the file, and distribution when not linked | 
|  | into another program.) | 
|  |  | 
|  | Note that people who make modified versions of this file are not | 
|  | obligated to grant this special exception for their modified | 
|  | versions; it is their choice whether to do so. The GNU Lesser | 
|  | General Public License gives permission to release a modified | 
|  | version without this exception; this exception also makes it | 
|  | possible to release a modified version which carries forward this | 
|  | exception. | 
|  |  | 
|  | The GNU C Library is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | Lesser General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU Lesser General Public | 
|  | License along with the GNU C Library.  If not, see | 
|  | <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | .import main, code | 
|  | .import $global$, data | 
|  | .import __libc_start_main, code | 
|  | .import __libc_csu_fini, code | 
|  | .import __libc_csu_init, code | 
|  |  | 
|  | /* Have the linker create plabel words so we get PLABEL32 | 
|  | relocs and not 21/14.  The use of 21/14 relocs is only | 
|  | supported in the latest dynamic linker.  */ | 
|  | #ifdef SHARED | 
|  | .section	.data.rel.ro,"aw",@progbits | 
|  | #else | 
|  | .section	.rodata,"a",@progbits | 
|  | #endif | 
|  | .align 4 | 
|  | .Lpmain: | 
|  | .word P%main | 
|  | .Lp__libc_start_main: | 
|  | .word P%__libc_start_main | 
|  | .Lp__libc_csu_fini: | 
|  | .word P%__libc_csu_fini | 
|  | .Lp__libc_csu_init: | 
|  | .word P%__libc_csu_init | 
|  | #ifdef SHARED | 
|  | .Lp__global: | 
|  | .word $global$ | 
|  | #endif | 
|  |  | 
|  | .text | 
|  | .align 4 | 
|  | .globl _start | 
|  | .export _start, ENTRY | 
|  | .type _start,@function | 
|  | _start: | 
|  | /* At entry to the function we have: | 
|  |  | 
|  | r26 - Unused | 
|  | r25 - argc | 
|  | r24 - argv | 
|  | r23 - False _dl_fini plabel address | 
|  |  | 
|  | This function is called from the lower half of RTLD_START. | 
|  |  | 
|  | The call to __libc_start_main expects: | 
|  |  | 
|  | 1. r26 - Application main | 
|  | 2. r25 - argc | 
|  | 3. r24 - argv | 
|  | 4. r23 - __libc_csu_init | 
|  | 5. sp-52 - __libc_csu_fini | 
|  | 6. sp-56 - rtld_fini | 
|  | 7. sp-60 - stackend  */ | 
|  |  | 
|  | .proc | 
|  | .callinfo | 
|  | /* Clear previous-sp.  */ | 
|  | stw	%r0, -4(%sp) | 
|  | /* Setup the stack and frame.  */ | 
|  | stw	%rp, -20(%sp) | 
|  | ldo	64(%sp), %sp | 
|  | stw	%sp, -4(%sp) | 
|  | stw	%r19, -32(%sp) | 
|  |  | 
|  | /* argc and argv should be in 25 and 24 (2nd and 3rd argument) */ | 
|  | /* void (*rtld_fini) (void) (6th argument) */ | 
|  | stw	%r23, -56(%sp) | 
|  | /* Need to setup 1, 4, 5, and 7th arguments */ | 
|  |  | 
|  | #ifdef SHARED | 
|  | /* load main (1st argument) */ | 
|  | addil	LT'.Lpmain, %r19 | 
|  | ldw	RT'.Lpmain(%r1), %r26 | 
|  | ldw	0(%r26),%r26 | 
|  | /* void (*init) (void) (4th argument) */ | 
|  | addil	LT'.Lp__libc_csu_init, %r19 | 
|  | ldw	RT'.Lp__libc_csu_init(%r1), %r23 | 
|  | ldw	0(%r23), %r23 | 
|  | /* void (*fini) (void) (5th argument) */ | 
|  | addil	LT'.Lp__libc_csu_fini, %r19 | 
|  | ldw	RT'.Lp__libc_csu_fini(%r1), %r22 | 
|  | ldw	0(%r22), %r22 | 
|  | #else | 
|  | /* load main (1st argument) */ | 
|  | ldil	LR'.Lpmain, %r26 | 
|  | ldw	RR'.Lpmain(%r26), %r26 | 
|  | /* void (*init) (void) (4th argument) */ | 
|  | ldil	LR'.Lp__libc_csu_init, %r23 | 
|  | ldw	RR'.Lp__libc_csu_init(%r23), %r23 | 
|  | /* void (*fini) (void) (5th argument) */ | 
|  | ldil	LR'.Lp__libc_csu_fini, %r22 | 
|  | ldw	RR'.Lp__libc_csu_fini(%r22), %r22 | 
|  | #endif | 
|  | /* Store 5th argument */ | 
|  | stw	%r22, -52(%sp) | 
|  | /* void *stack_end (7th argument) */ | 
|  | stw	%sp, -60(%sp) | 
|  |  | 
|  | #ifdef SHARED | 
|  | addil	LT'.Lp__global, %r19 | 
|  | ldw	RT'.Lp__global(%r1), %dp | 
|  | #else | 
|  | /* load global */ | 
|  | ldil	L%$global$, %dp | 
|  | ldo	R%$global$(%dp), %dp | 
|  | #endif | 
|  | bl	__libc_start_main,%r2 | 
|  | nop | 
|  | /* die horribly if it returned (it shouldn't) */ | 
|  | iitlbp %r0,(%sr0,%r0) | 
|  | nop | 
|  |  | 
|  | .procend | 
|  |  | 
|  | /* Define a symbol for the first piece of initialized data.  */ | 
|  | .data | 
|  | .globl __data_start | 
|  | __data_start: | 
|  | .long 0 | 
|  | .weak data_start | 
|  | data_start = __data_start |