diff options
Diffstat (limited to 'packages/glibc/glibc-2.3.2/glibc23-01-hppa-dl-machine.patch')
-rw-r--r-- | packages/glibc/glibc-2.3.2/glibc23-01-hppa-dl-machine.patch | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/packages/glibc/glibc-2.3.2/glibc23-01-hppa-dl-machine.patch b/packages/glibc/glibc-2.3.2/glibc23-01-hppa-dl-machine.patch index e69de29bb2..f5f02d1992 100644 --- a/packages/glibc/glibc-2.3.2/glibc23-01-hppa-dl-machine.patch +++ b/packages/glibc/glibc-2.3.2/glibc23-01-hppa-dl-machine.patch @@ -0,0 +1,305 @@ +--- libc/sysdeps/hppa/dl-machine.h Wed Nov 14 09:47:09 2001 ++++ libc/sysdeps/hppa/dl-machine.h Wed Nov 14 09:46:02 2001 +@@ -28,8 +28,15 @@ + #include <link.h> + #include <assert.h> + ++# define VALID_ELF_OSABI(osabi) ((osabi == ELFOSABI_SYSV) || (osabi == ELFOSABI_LINUX)) ++# define VALID_ELF_ABIVERSION(ver) (ver == 0) ++# define VALID_ELF_HEADER(hdr,exp,size) \ ++ memcmp (hdr,exp,size-2) == 0 \ ++ && VALID_ELF_OSABI (hdr[EI_OSABI]) \ ++ && VALID_ELF_ABIVERSION (hdr[EI_ABIVERSION]) ++ + /* These must match the definition of the stub in bfd/elf32-hppa.c. */ +-#define SIZEOF_PLT_STUB (4*4) ++#define SIZEOF_PLT_STUB (7*4) + #define GOT_FROM_PLT_STUB (4*4) + + /* A PLABEL is a function descriptor. Properly they consist of just +@@ -66,45 +73,41 @@ + return ehdr->e_machine == EM_PARISC; + } + +- + /* Return the link-time address of _DYNAMIC. */ + static inline Elf32_Addr ++elf_machine_dynamic (void) __attribute__ ((const)); ++ ++static inline Elf32_Addr + elf_machine_dynamic (void) + { + Elf32_Addr dynamic; + +-#if 0 +- /* Use this method if GOT address not yet set up. */ +- asm ( +-" b,l 1f,%0\n" ++ asm ("b,l 1f,%0\n" + " depi 0,31,2,%0\n" + "1: addil L'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 8),%0\n" + " ldw R'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 12)(%%r1),%0\n" +- : "=r" (dynamic) : : "r1"); +-#else +- /* This works because we already have our GOT address available. */ +- dynamic = (Elf32_Addr) &_DYNAMIC; +-#endif ++ : "=r" (dynamic) : : "r1"); + + return dynamic; + } + + /* Return the run-time load address of the shared object. */ + static inline Elf32_Addr ++elf_machine_load_address (void) __attribute__ ((const)); ++ ++static inline Elf32_Addr + elf_machine_load_address (void) + { +- Elf32_Addr dynamic, dynamic_linkaddress; ++ Elf32_Addr dynamic; + + asm ( + " b,l 1f,%0\n" + " depi 0,31,2,%0\n" + "1: addil L'_DYNAMIC - ($PIC_pcrel$0 - 8),%0\n" +-" ldo R'_DYNAMIC - ($PIC_pcrel$0 - 12)(%%r1),%1\n" +-" addil L'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 16),%0\n" +-" ldw R'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 20)(%%r1),%0\n" +- : "=r" (dynamic_linkaddress), "=r" (dynamic) : : "r1"); ++" ldo R'_DYNAMIC - ($PIC_pcrel$0 - 12)(%%r1),%0\n" ++ : "=r" (dynamic) : : "r1"); + +- return dynamic - dynamic_linkaddress; ++ return dynamic - elf_machine_dynamic (); + } + + /* Fixup a PLT entry to bounce directly to the function at VALUE. */ +@@ -167,41 +170,39 @@ + fptr = (struct hppa_fptr *) (reloc->r_offset + l_addr); + if (r_sym != 0) + { +- /* Relocate the pointer to the stub. */ +- fptr->func += l_addr; +- /* Instead of the LTP value, we put the reloc offset +- here. The trampoline code will load the proper +- LTP and pass the reloc offset to the fixup +- function. */ +- fptr->gp = iplt - jmprel; + if (!got) + { + static union { + unsigned char c[8]; + Elf32_Addr i[2]; + } sig = {{0x00,0xc0,0xff,0xee, 0xde,0xad,0xbe,0xef}}; ++ const Elf32_Rela *last_rel; ++ ++ last_rel = (const Elf32_Rela *) end_jmprel - 1; ++ ++ /* The stub is immediately after the last .plt ++ entry. Rely on .plt relocs being ordered. */ ++ if (last_rel->r_offset == 0) ++ return 0; + + /* Find our .got section. It's right after the + stub. */ +- got = (Elf32_Addr *) (fptr->func + GOT_FROM_PLT_STUB); ++ got = (Elf32_Addr *) (last_rel->r_offset + l_addr ++ + 8 + SIZEOF_PLT_STUB); + +- /* Sanity check to see if the address we are +- going to check below is within a reasonable +- approximation of the bounds of the PLT (or, +- at least, is at an address that won't fault +- on read). Then check for the magic signature +- above. */ +- if (fptr->func < (Elf32_Addr) fptr + sizeof(*fptr)) +- return 0; +- if (fptr->func > +- ((Elf32_Addr) fptr +- + SIZEOF_PLT_STUB +- + ((l->l_info[DT_PLTRELSZ]->d_un.d_val / sizeof (Elf32_Rela)) +- * 8))) +- return 0; ++ /* Check the magic signature. */ + if (got[-2] != sig.i[0] || got[-1] != sig.i[1]) + return 0; /* No lazy linking for you! */ + } ++ ++ /* Relocate the pointer to the stub. */ ++ fptr->func = (Elf32_Addr) got - GOT_FROM_PLT_STUB; ++ ++ /* Instead of the LTP value, we put the reloc offset ++ here. The trampoline code will load the proper ++ LTP and pass the reloc offset to the fixup ++ function. */ ++ fptr->gp = iplt - jmprel; + } + else + { +@@ -271,22 +272,24 @@ + " stw %r25,-40(%sp)\n" /* argc */ \ + " stw %r24,-44(%sp)\n" /* argv */ \ + \ +- /* We need the LTP, and we need it now. */ \ +- /* $PIC_pcrel$0 points 8 bytes past the current instruction, \ +- just like a branch reloc. This sequence gets us the runtime \ +- address of _DYNAMIC. */ \ ++ /* We need the LTP, and we need it now. \ ++ $PIC_pcrel$0 points 8 bytes past the current instruction, \ ++ just like a branch reloc. This sequence gets us the \ ++ runtime address of _DYNAMIC. */ \ + " bl 0f,%r19\n" \ + " depi 0,31,2,%r19\n" /* clear priviledge bits */ \ + "0: addil L'_DYNAMIC - ($PIC_pcrel$0 - 8),%r19\n" \ + " ldo R'_DYNAMIC - ($PIC_pcrel$0 - 12)(%r1),%r26\n" \ + \ +- /* Also get the link time address from the first entry of the GOT. */ \ ++ /* The link time address is stored in the first entry of the \ ++ GOT. */ \ + " addil L'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 16),%r19\n" \ + " ldw R'_GLOBAL_OFFSET_TABLE_ - ($PIC_pcrel$0 - 20)(%r1),%r20\n" \ + \ + " sub %r26,%r20,%r20\n" /* Calculate load offset */ \ + \ +- /* Rummage through the dynamic entries, looking for DT_PLTGOT. */ \ ++ /* Rummage through the dynamic entries, looking for \ ++ DT_PLTGOT. */ \ + " ldw,ma 8(%r26),%r19\n" \ + "1: cmpib,=,n 3,%r19,2f\n" /* tag == DT_PLTGOT? */ \ + " cmpib,<>,n 0,%r19,1b\n" \ +@@ -306,8 +309,8 @@ + | 32 bytes of magic | \ + |---------------------------------| \ + | 32 bytes argument/sp save area | \ +- |---------------------------------| ((current->mm->env_end) + 63 & ~63) \ +- | N bytes of slack | \ ++ |---------------------------------| ((current->mm->env_end) \ ++ | N bytes of slack | + 63 & ~63) \ + |---------------------------------| \ + | envvar and arg strings | \ + |---------------------------------| \ +@@ -375,7 +378,7 @@ + " bl _dl_init,%r2\n" \ + " ldo 4(%r23),%r23\n" /* delay slot */ \ + \ +- /* Reload argc, argv to the registers start.S expects them in (feh) */ \ ++ /* Reload argc, argv to the registers start.S expects. */ \ + " ldw -40(%sp),%r25\n" \ + " ldw -44(%sp),%r24\n" \ + \ +@@ -387,8 +390,8 @@ + " .word 0xdeadbeef\n" \ + " .previous\n" \ + \ +- /* %r3 contains a function pointer, we need to mask out the lower \ +- * bits and load the gp and jump address. */ \ ++ /* %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\n" \ + " ldw 0(%r3),%r2\n" \ + " addil LT'__dl_fini_plabel,%r19\n" \ +@@ -409,43 +412,41 @@ + Enter with r19 = reloc offset, r20 = got-8, r21 = fixup ltp. */ + #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name) \ + extern void tramp_name (void); \ +- asm ( "\ +- /* Trampoline for " #tramp_name " */ \n\ +- .globl " #tramp_name " \n\ +- .type " #tramp_name ",@function \n\ +-" #tramp_name ": \n\ +- /* Save return pointer */ \n\ +- stw %r2,-20(%sp) \n\ +- /* Save argument registers in the call stack frame. */ \n\ +- stw %r26,-36(%sp) \n\ +- stw %r25,-40(%sp) \n\ +- stw %r24,-44(%sp) \n\ +- stw %r23,-48(%sp) \n\ +- /* Build a call frame. */ \n\ +- stwm %sp,64(%sp) \n\ +- \n\ +- /* Set up args to fixup func. */ \n\ +- ldw 8+4(%r20),%r26 /* got[1] == struct link_map * */ \n\ +- copy %r19,%r25 /* reloc offset */ \n\ +- \n\ +- /* Call the real address resolver. */ \n\ +- bl " #fixup_name ",%r2 \n\ +- copy %r21,%r19 /* delay slot, set fixup func ltp */ \n\ +- \n\ +- ldwm -64(%sp),%sp \n\ +- /* Arguments. */ \n\ +- ldw -36(%sp),%r26 \n\ +- ldw -40(%sp),%r25 \n\ +- ldw -44(%sp),%r24 \n\ +- ldw -48(%sp),%r23 \n\ +- /* Return pointer. */ \n\ +- ldw -20(%sp),%r2 \n\ +- /* Call the real function. */ \n\ +- ldw 0(%r28),%r22 \n\ +- bv %r0(%r22) \n\ +- ldw 4(%r28),%r19 \n\ +-"); +- ++ asm (".globl " #tramp_name "\n" \ ++ " .type " #tramp_name ",@function\n" \ ++ #tramp_name ":\n" \ ++ /* Save return pointer */ \ ++ " stw %r2,-20(%sp)\n" \ ++ /* Save argument registers in the call stack frame. */ \ ++ " stw %r26,-36(%sp)\n" \ ++ " stw %r25,-40(%sp)\n" \ ++ " stw %r24,-44(%sp)\n" \ ++ " stw %r23,-48(%sp)\n" \ ++ /* Build a call frame, and save structure pointer. */ \ ++ " stwm %r28,64(%sp)\n" \ ++ \ ++ /* Set up args to fixup func. */ \ ++ " ldw 8+4(%r20),%r26\n" /* got[1] == struct link_map * */ \ ++ " copy %r19,%r25\n" /* reloc offset */ \ ++ \ ++ /* Call the real address resolver. */ \ ++ " bl " #fixup_name ",%r2\n" \ ++ " copy %r21,%r19\n" /* delay slot, set fixup func ltp */ \ ++ \ ++ " ldw 0(%r28),%r22\n" /* load up the returned func ptr */ \ ++ " ldw 4(%r28),%r19\n" \ ++ " ldwm -64(%sp),%r28\n" \ ++ /* Arguments. */ \ ++ " ldw -36(%sp),%r26\n" \ ++ " ldw -40(%sp),%r25\n" \ ++ " ldw -44(%sp),%r24\n" \ ++ " ldw -48(%sp),%r23\n" \ ++ /* Call the real function. */ \ ++ " bv %r0(%r22)\n" \ ++ /* Return pointer. */ \ ++ " ldw -20(%sp),%r2\n" \ ++ ); ++ + #ifndef PROF + #define ELF_MACHINE_RUNTIME_TRAMPOLINE \ + TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup); \ +@@ -570,15 +571,15 @@ + probably haven't relocated the necessary values by this + point so we have to find them ourselves. */ + +- asm ("bl 0f,%0 \n\ +- depi 0,31,2,%0 \n\ +-0: addil L'__boot_ldso_fptr - ($PIC_pcrel$0 - 8),%0 \n\ +- ldo R'__boot_ldso_fptr - ($PIC_pcrel$0 - 12)(%%r1),%1 \n\ +- addil L'__fptr_root - ($PIC_pcrel$0 - 16),%0 \n\ +- ldo R'__fptr_root - ($PIC_pcrel$0 - 20)(%%r1),%2 \n\ +- addil L'__fptr_count - ($PIC_pcrel$0 - 24),%0 \n\ +- ldo R'__fptr_count - ($PIC_pcrel$0 - 28)(%%r1),%3" +- : ++ asm ("bl 0f,%0\n\t" ++ "depi 0,31,2,%0\n\t" ++ "0:\taddil L'__boot_ldso_fptr - ($PIC_pcrel$0 - 8),%0\n\t" ++ "ldo R'__boot_ldso_fptr - ($PIC_pcrel$0 - 12)(%%r1),%1\n\t" ++ "addil L'__fptr_root - ($PIC_pcrel$0 - 16),%0\n\t" ++ "ldo R'__fptr_root - ($PIC_pcrel$0 - 20)(%%r1),%2\n\t" ++ "addil L'__fptr_count - ($PIC_pcrel$0 - 24),%0\n\t" ++ "ldo R'__fptr_count - ($PIC_pcrel$0 - 28)(%%r1),%3" ++ : + "=r" (dot), + "=r" (p_boot_ldso_fptr), + "=r" (p_fptr_root), |