diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | sysdeps/hppa/dl-machine.h | 30 |
2 files changed, 36 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 4406b15ce9..ce00c3ffad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2001-03-21 Alan Modra <alan@one.net.au> + + * sysdeps/hppa/dl-machine.h (RTLD_START): Set up dp with DT_PLTGOT + value from application so that constructors in non-PIC libs work. + +2000-12-13 Jes Sorensen <jes@linuxcare.com> + + * sysdeps/hppa/dl-machine.h (RTLD_START): _dl_init now returns a + function pointer, hence load the jump address and gp from the + function pointer before jumping. + 2001-04-24 Andreas Jaeger <aj@suse.de> * sysdeps/generic/send.c (__send): Return ssize_t. diff --git a/sysdeps/hppa/dl-machine.h b/sysdeps/hppa/dl-machine.h index a3437b557a..6f2020c071 100644 --- a/sysdeps/hppa/dl-machine.h +++ b/sysdeps/hppa/dl-machine.h @@ -248,7 +248,17 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) The C function `_dl_start' is the real entry point; its return value is the user program's entry point. */ -#define RTLD_START asm ("\ +#define RTLD_START \ +/* Set up dp for any non-PIC lib constructors that may be called. */ \ +static struct link_map * set_dp (struct link_map *map) \ +{ \ + register Elf32_Addr dp asm ("%r27"); \ + dp = D_PTR (map, l_info[DT_PLTGOT]); \ + asm volatile ("" : : "r" (dp)); \ + return map; \ +} \ + \ +asm ("\ .text .globl _start .type _start,@function @@ -324,7 +334,6 @@ _start: bl _dl_start,%rp ldo -4(%r24),%r26 - /* FALLTHRU */ .globl _dl_start_user .type _dl_start_user,@function _dl_start_user: @@ -352,10 +361,14 @@ _dl_start_user: stw %r24,-44(%sp) .Lnofix: - /* Call _dl_init(_dl_loaded, argc, argv, envp). */ addil LT'_dl_loaded,%r19 ldw RT'_dl_loaded(%r1),%r26 + bl set_dp, %r2 ldw 0(%r26),%r26 + + /* Call _dl_init(_dl_loaded, argc, argv, envp). */ + copy %r28,%r26 + /* envp = argv + argc + 1 */ sh2add %r25,%r24,%r23 bl _dl_init,%r2 @@ -373,11 +386,18 @@ __dl_fini_plabel: .word 0xdeadbeef .previous + /* %r3 contains a function pointer, we need to mask out the lower + * bits and load the gp and jump address. */ + depi 0,31,2,%r3 + ldw 0(%r3),%r2 addil LT'__dl_fini_plabel,%r19 ldw RT'__dl_fini_plabel(%r1),%r23 stw %r19,4(%r23) - bv %r0(%r3) - depi 2,31,2,%r23 /* delay slot */"); + ldw 4(%r3),%r19 /* load the object's gp */ + bv %r0(%r2) + depi 2,31,2,%r23 /* delay slot */ +"); + /* This code gets called via the .plt stub, and is used in dl-runtime.c to call the `fixup' function and then redirect to the |