diff options
Diffstat (limited to 'sysdeps/hppa/start.S')
-rw-r--r-- | sysdeps/hppa/start.S | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/sysdeps/hppa/start.S b/sysdeps/hppa/start.S index 5db1ba960b..1d69ae8a4b 100644 --- a/sysdeps/hppa/start.S +++ b/sysdeps/hppa/start.S @@ -42,7 +42,7 @@ /* 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 +#ifdef PIC .section .data.rel.ro,"aw",@progbits #else .section .rodata,"a",@progbits @@ -56,10 +56,6 @@ .word P%__libc_csu_fini .Lp__libc_csu_init: .word P%__libc_csu_init -#ifdef SHARED -.Lp__global: - .word $global$ -#endif .text .align 4 @@ -99,9 +95,15 @@ _start: /* 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 +#ifdef PIC + /* Load $global$ address into %dp */ + bl .+8, %dp + addil L'$global$-$PIC_pcrel$0+1, %dp + ldo R'$global$-$PIC_pcrel$0+5(%r1), %dp + /* load main (1st argument) */ addil LT'.Lpmain, %r19 ldw RT'.Lpmain(%r1), %r26 @@ -115,6 +117,10 @@ _start: ldw RT'.Lp__libc_csu_fini(%r1), %r22 ldw 0(%r22), %r22 #else + /* Load $global$ address into %dp */ + ldil L%$global$, %dp + ldo R%$global$(%dp), %dp + /* load main (1st argument) */ ldil LR'.Lpmain, %r26 ldw RR'.Lpmain(%r26), %r26 @@ -129,17 +135,6 @@ _start: stw %r22, -52(%sp) /* void *stack_end (7th argument) */ stw %sp, -60(%sp) - -#ifdef SHARED - /* load global */ - addil LT'.Lp__global, %r19 - ldw RT'.Lp__global(%r1), %dp - ldw 0(%dp), %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) */ |