]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
PowerPC64 ELFv2 PPC64_OPT_LOCALENTRY
authorAlan Modra <amodra@gmail.com>
Wed, 14 Jun 2017 01:17:25 +0000 (10:47 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 14 Jun 2017 01:17:25 +0000 (10:47 +0930)
ELFv2 functions with localentry:0 are those with a single entry point,
ie. global entry == local entry, that have no requirement on r2 or
r12 and guarantee r2 is unchanged on return.  Such an external
function can be called via the PLT without saving r2 or restoring it
on return, avoiding a common load-hit-store for small functions.

This patch implements the ld.so changes necessary for this
optimization.  ld.so needs to check that an optimized plt call
sequence is in fact calling a function implemented with localentry:0,
end emit a fatal error otherwise.

The elf/testobj6.c change is to stop "error while loading shared
libraries: expected localentry:0 `preload'" when running
elf/preloadtest, which we'd get otherwise.

* elf/elf.h (PPC64_OPT_LOCALENTRY): Define.
* sysdeps/alpha/dl-machine.h (elf_machine_fixup_plt): Add
refsym and sym parameters.  Adjust callers.
* sysdeps/aarch64/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/arm/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/generic/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/hppa/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/i386/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/ia64/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/m68k/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/microblaze/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/mips/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/nios2/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_fixup_plt):
Likewise.
* sysdeps/s390/s390-32/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/s390/s390-64/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/sh/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/tile/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/x86_64/dl-machine.h (elf_machine_fixup_plt): Likewise.
* sysdeps/powerpc/powerpc64/dl-machine.c (_dl_error_localentry): New.
(_dl_reloc_overflow): Increase buffser size.  Formatting.
* sysdeps/powerpc/powerpc64/dl-machine.h (ppc64_local_entry_offset):
Delete reloc param, add refsym and sym.  Check optimized plt
call stubs for localentry:0 functions.  Adjust callers.
(elf_machine_fixup_plt, elf_machine_plt_conflict): Add refsym
and sym parameters.  Adjust callers.
(_dl_reloc_overflow): Move attribute.
(_dl_error_localentry): Declare.
* elf/dl-runtime.c (_dl_fixup): Save original sym.  Pass
refsym and sym to elf_machine_fixup_plt.
* elf/testobj6.c (preload): Call printf.

25 files changed:
ChangeLog
elf/dl-runtime.c
elf/elf.h
elf/testobj6.c
sysdeps/aarch64/dl-machine.h
sysdeps/alpha/dl-machine.h
sysdeps/arm/dl-machine.h
sysdeps/generic/dl-machine.h
sysdeps/hppa/dl-machine.h
sysdeps/i386/dl-machine.h
sysdeps/ia64/dl-machine.h
sysdeps/m68k/dl-machine.h
sysdeps/microblaze/dl-machine.h
sysdeps/mips/dl-machine.h
sysdeps/nios2/dl-machine.h
sysdeps/powerpc/powerpc32/dl-machine.h
sysdeps/powerpc/powerpc64/dl-machine.c
sysdeps/powerpc/powerpc64/dl-machine.h
sysdeps/s390/s390-32/dl-machine.h
sysdeps/s390/s390-64/dl-machine.h
sysdeps/sh/dl-machine.h
sysdeps/sparc/sparc32/dl-machine.h
sysdeps/sparc/sparc64/dl-machine.h
sysdeps/tile/dl-machine.h
sysdeps/x86_64/dl-machine.h

index af5756112d470d73a3e6e95f56085f9c7d511792..a06a70c939002a77b22f2a743cda454796297c60 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+2017-06-14  Alan Modra  <amodra@gmail.com>
+
+       * elf/elf.h (PPC64_OPT_LOCALENTRY): Define.
+       * sysdeps/alpha/dl-machine.h (elf_machine_fixup_plt): Add
+       refsym and sym parameters.  Adjust callers.
+       * sysdeps/aarch64/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/arm/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/generic/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/hppa/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/i386/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/ia64/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/m68k/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/microblaze/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/mips/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/nios2/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_fixup_plt):
+       Likewise.
+       * sysdeps/s390/s390-32/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/s390/s390-64/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/sh/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/tile/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/x86_64/dl-machine.h (elf_machine_fixup_plt): Likewise.
+       * sysdeps/powerpc/powerpc64/dl-machine.c (_dl_error_localentry): New.
+       (_dl_reloc_overflow): Increase buffser size.  Formatting.
+       * sysdeps/powerpc/powerpc64/dl-machine.h (ppc64_local_entry_offset):
+       Delete reloc param, add refsym and sym.  Check optimized plt
+       call stubs for localentry:0 functions.  Adjust callers.
+       (elf_machine_fixup_plt, elf_machine_plt_conflict): Add refsym
+       and sym parameters.  Adjust callers.
+       (_dl_reloc_overflow): Move attribute.
+       (_dl_error_localentry): Declare.
+       * elf/dl-runtime.c (_dl_fixup): Save original sym.  Pass
+       refsym and sym to elf_machine_fixup_plt.
+       * elf/testobj6.c (preload): Call printf.
+
 2017-06-14  Alan Modra  <amodra@gmail.com>
 
        * sysdeps/powerpc/powerpc64/sysdep.h: Formatting.
index 7d1d240403d3f82ff71a62193c96b78d66109d61..51d3819d4ac19c4d52bef7cbf03ef63fb1ac6d50 100644 (file)
@@ -71,6 +71,7 @@ _dl_fixup (
   const PLTREL *const reloc
     = (const void *) (D_PTR (l, l_info[DT_JMPREL]) + reloc_offset);
   const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
+  const ElfW(Sym) *refsym = sym;
   void *const rel_addr = (void *)(l->l_addr + reloc->r_offset);
   lookup_t result;
   DL_FIXUP_VALUE_TYPE value;
@@ -145,7 +146,7 @@ _dl_fixup (
   if (__glibc_unlikely (GLRO(dl_bind_not)))
     return value;
 
-  return elf_machine_fixup_plt (l, result, reloc, rel_addr, value);
+  return elf_machine_fixup_plt (l, result, refsym, sym, reloc, rel_addr, value);
 }
 
 #ifndef PROF
index fff893d433d925bea7c6ea8251425e11feee1b8f..3900b4c9f0cad606a7beb2511c0bb6d603e885ee 100644 (file)
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -2544,9 +2544,10 @@ enum
 #define DT_PPC64_OPT   (DT_LOPROC + 3)
 #define DT_PPC64_NUM    4
 
-/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry.  */
+/* PowerPC64 specific bits in the DT_PPC64_OPT Dyn entry.  */
 #define PPC64_OPT_TLS          1
 #define PPC64_OPT_MULTI_TOC    2
+#define PPC64_OPT_LOCALENTRY   4
 
 /* PowerPC64 specific values for the Elf64_Sym st_other field.  */
 #define STO_PPC64_LOCAL_BIT    5
index fcba01631dc666071642f812f1dc18bc775da7d0..84da4c9e22cc422bb6916f003ef00b414cbf9216 100644 (file)
@@ -1,3 +1,5 @@
+#include <stdio.h>
+
 #include "testobj.h"
 
 int
@@ -15,5 +17,6 @@ obj6func2 (int a)
 int
 preload (int a)
 {
+  printf ("testobj6 preload\n");
   return a;
 }
index 15d79a6961ff999383a7e57c75dc596c7e43877e..02fab04f4009842dce5f3f6f10a8bc55fe227cd4 100644 (file)
@@ -245,6 +245,7 @@ dl_platform_init (void)
 
 static inline ElfW(Addr)
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const ElfW(Rela) *reloc,
                       ElfW(Addr) *reloc_addr,
                       ElfW(Addr) value)
index 7580cd29b68962b6a5fe42d58a15ac3707cd1766..7077796d2e2216a0cd874ab0ca81d23ce33745ae 100644 (file)
@@ -260,6 +260,7 @@ dl_platform_init (void)
    rather than the dynamic linker.  */
 static inline Elf64_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf64_Rela *reloc,
                       Elf64_Addr *got_addr, Elf64_Addr value)
 {
@@ -434,11 +435,11 @@ elf_machine_rela (struct link_map *map,
          RESOLVE_CONFLICT_FIND_MAP (map, reloc_addr);
          reloc = ((const Elf64_Rela *) D_PTR (map, l_info[DT_JMPREL]))
                  + (r_type >> 8);
-         elf_machine_fixup_plt (map, 0, reloc, reloc_addr, sym_value);
+         elf_machine_fixup_plt (map, 0, 0, 0, reloc, reloc_addr, sym_value);
        }
 #else
       else if (r_type == R_ALPHA_JMP_SLOT)
-       elf_machine_fixup_plt (map, 0, reloc, reloc_addr, sym_value);
+       elf_machine_fixup_plt (map, 0, 0, 0, reloc, reloc_addr, sym_value);
 #endif
 #ifndef RTLD_BOOTSTRAP
       else if (r_type == R_ALPHA_REFQUAD)
index 2c72972bd22723c82ae4ae897604fd7f8da9c207..7053ead16ed0e7dac182660f7d88fa21f2b4799a 100644 (file)
@@ -263,6 +263,7 @@ dl_platform_init (void)
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rel *reloc,
                       Elf32_Addr *reloc_addr, Elf32_Addr value)
 {
index 59749bd84f6152fd055269b8bd6aaf2a01586510..41537601d2cc0c13f568f00f8213fa381d1721e9 100644 (file)
@@ -51,10 +51,11 @@ elf_machine_load_address (void)
 
 /* Fixup a PLT entry to bounce directly to the function at VALUE.  */
 
-static inline Elf32_Addr
+static inline ElfW(Addr)
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
-                      const Elf32_Rel *reloc,
-                      Elf32_Addr *reloc_addr, Elf32_Addr value)
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
+                      const ElfW(Rel) *reloc,
+                      ElfW(Addr) *reloc_addr, ElfW(Addr) value)
 {
   return *reloc_addr = value;
 }
index 787b95f5022e0094e630eaad73e5296eedf8d284..b7bdf871f1c6af2998c1904a3b4bce12b8d530f9 100644 (file)
@@ -112,6 +112,7 @@ elf_machine_load_address (void)
 /* Fixup a PLT entry to bounce directly to the function at VALUE. */
 static inline struct fdesc __attribute__ ((always_inline))
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rela *reloc,
                       Elf32_Addr *reloc_addr, struct fdesc value)
 {
@@ -652,13 +653,13 @@ elf_machine_rela (struct link_map *map,
     case R_PARISC_IPLT:
       if (__builtin_expect (sym_map != NULL, 1))
        {
-         elf_machine_fixup_plt (NULL, sym_map, reloc, reloc_addr,
+         elf_machine_fixup_plt (NULL, sym_map, NULL, NULL reloc, reloc_addr,
                                 DL_FIXUP_MAKE_VALUE(sym_map, value));
        }
       else
        {
          /* If we get here, it's a (weak) undefined sym.  */
-         elf_machine_fixup_plt (NULL, map, reloc, reloc_addr,
+         elf_machine_fixup_plt (NULL, map, NULL, NULL, reloc, reloc_addr,
                                 DL_FIXUP_MAKE_VALUE(map, value));
        }
       return;
index 57d4a0bdbd621d24aae0fb95b286663140a519a5..9ee9d02c3662c8e4759bf99cd23b2df5822196fc 100644 (file)
@@ -246,6 +246,7 @@ dl_platform_init (void)
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rel *reloc,
                       Elf32_Addr *reloc_addr, Elf32_Addr value)
 {
index 9c08161d65ff9c9a6f99ca5d0c63ed8f3114e8c0..8d0d3c97dd5feaa82d1c077b0fa02ee480f59a70 100644 (file)
@@ -333,6 +333,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 /* Fixup a PLT entry to bounce directly to the function at VALUE.  */
 static inline struct fdesc __attribute__ ((always_inline))
 elf_machine_fixup_plt (struct link_map *l, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf64_Rela *reloc,
                       Elf64_Addr *reloc_addr, struct fdesc value)
 {
@@ -424,7 +425,7 @@ elf_machine_rela (struct link_map *map,
            ;/* No adjustment.  */
          else if (r_type == R_IA64_IPLTLSB)
            {
-             elf_machine_fixup_plt (NULL, NULL, reloc, reloc_addr,
+             elf_machine_fixup_plt (NULL, NULL, NULL, NULL, reloc, reloc_addr,
                                     DL_FIXUP_MAKE_VALUE (sym_map, value));
              return;
            }
index 8f457cea5ae2170893fa297247d160ae058a481b..fd8fb001031bd729d0a13ea7ce597b3f336e8afd 100644 (file)
@@ -182,6 +182,7 @@ _dl_start_user:\n\
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rela *reloc,
                       Elf32_Addr *reloc_addr, Elf32_Addr value)
 {
index cc80b30868d36ad07cfabac6bf4d6b096732e428..9481ff1efa261fd1858404d184e98db7fe9626a6 100644 (file)
@@ -174,6 +174,7 @@ _dl_start_user:\n\
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rela *reloc,
                       Elf32_Addr *reloc_addr, Elf32_Addr value)
 {
index ed47513ccc1d23d23d32ee640053d2f351f3990b..74ead7f5247f19708e941a04d9f76825431ebc5b 100644 (file)
@@ -453,6 +453,7 @@ dl_platform_init (void)
    the corresponding PLT entry instead.  */
 static inline ElfW(Addr)
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const ElfW(Rel) *reloc,
                       ElfW(Addr) *reloc_addr, ElfW(Addr) value)
 {
index 8d2b18de234888c9cf828f97ae58b412b23053a0..b5fdd9b2bd1a45421d7b914f921df3383b4676fa 100644 (file)
@@ -207,6 +207,7 @@ _start:\n\
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rela *reloc,
                       Elf32_Addr *reloc_addr, Elf32_Addr value)
 {
index 28eb50f92db778583c37100c171a7e97d9337b4c..1f8437ed9cf9e734d5416d2d36b2846d4314e05f 100644 (file)
@@ -235,6 +235,7 @@ extern Elf32_Addr __elf_machine_fixup_plt (struct link_map *map,
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rela *reloc,
                       Elf32_Addr *reloc_addr, Elf64_Addr finaladdr)
 {
index 0eccc6621a6606d4a926b6268f2f382d6ec535ef..2cfd43b21bdf199f2c7b7aad27c474c3b32294f3 100644 (file)
 
 void
 _dl_reloc_overflow (struct link_map *map,
-                  const char *name,
-                  Elf64_Addr *const reloc_addr,
-                  const Elf64_Sym *refsym)
+                   const char *name,
+                   Elf64_Addr *const reloc_addr,
+                   const Elf64_Sym *refsym)
 {
-  char buffer[128];
+  char buffer[1024];
   char *t;
   t = stpcpy (buffer, name);
   t = stpcpy (t, " reloc at 0x");
@@ -45,3 +45,19 @@ _dl_reloc_overflow (struct link_map *map,
   t = stpcpy (t, " out of range");
   _dl_signal_error (0, map->l_name, NULL, buffer);
 }
+
+#if _CALL_ELF == 2
+void
+_dl_error_localentry (struct link_map *map, const Elf64_Sym *refsym)
+{
+  char buffer[1024];
+  char *t;
+  const char *strtab;
+
+  strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+  t = stpcpy (buffer, "expected localentry:0 `");
+  t = stpcpy (t, strtab + refsym->st_name);
+  t = stpcpy (t, "'");
+  _dl_signal_error (0, map->l_name, NULL, buffer);
+}
+#endif
index 6391b3a5584757abcfcbbcd640782d5d94c7de4a..aeb91b8f692aee23261b39f8360458aa8e3f7580 100644 (file)
@@ -440,20 +440,30 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
 }
 
 #if _CALL_ELF == 2
-/* If the PLT entry whose reloc is 'reloc' resolves to a function in
-   the same object, return the target function's local entry point
-   offset if usable.  */
+extern void attribute_hidden _dl_error_localentry (struct link_map *map,
+                                                  const Elf64_Sym *refsym);
+
+/* If the PLT entry resolves to a function in the same object, return
+   the target function's local entry point offset if usable.  */
 static inline Elf64_Addr __attribute__ ((always_inline))
 ppc64_local_entry_offset (struct link_map *map, lookup_t sym_map,
-                         const Elf64_Rela *reloc)
+                         const ElfW(Sym) *refsym, const ElfW(Sym) *sym)
 {
-  const Elf64_Sym *symtab;
-  const Elf64_Sym *sym;
-
   /* If the target function is in a different object, we cannot
      use the local entry point.  */
   if (sym_map != map)
-    return 0;
+    {
+      /* Check that optimized plt call stubs for localentry:0 functions
+        are not being satisfied by a non-zero localentry symbol.  */
+      if (map->l_info[DT_PPC64(OPT)]
+         && (map->l_info[DT_PPC64(OPT)]->d_un.d_val & PPC64_OPT_LOCALENTRY) != 0
+         && refsym->st_info == ELFW(ST_INFO) (STB_GLOBAL, STT_FUNC)
+         && (STO_PPC64_LOCAL_MASK & refsym->st_other) == 0
+         && (STO_PPC64_LOCAL_MASK & sym->st_other) != 0)
+       _dl_error_localentry (map, refsym);
+
+      return 0;
+    }
 
   /* If the linker inserted multiple TOCs, we cannot use the
      local entry point.  */
@@ -461,16 +471,13 @@ ppc64_local_entry_offset (struct link_map *map, lookup_t sym_map,
       && (map->l_info[DT_PPC64(OPT)]->d_un.d_val & PPC64_OPT_MULTI_TOC))
     return 0;
 
-  /* Otherwise, we can use the local entry point.  Retrieve its offset
-     from the symbol's ELF st_other field.  */
-  symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
-  sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
-
   /* If the target function is an ifunc then the local entry offset is
      for the resolver, not the final destination.  */
   if (__builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0))
     return 0;
 
+  /* Otherwise, we can use the local entry point.  Retrieve its offset
+     from the symbol's ELF st_other field.  */
   return PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
 }
 #endif
@@ -479,6 +486,7 @@ ppc64_local_entry_offset (struct link_map *map, lookup_t sym_map,
    routine.  */
 static inline Elf64_Addr __attribute__ ((always_inline))
 elf_machine_fixup_plt (struct link_map *map, lookup_t sym_map,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf64_Rela *reloc,
                       Elf64_Addr *reloc_addr, Elf64_Addr finaladdr)
 {
@@ -534,7 +542,7 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t sym_map,
   PPC_DCBST (&plt->fd_func);
   PPC_ISYNC;
 #else
-  finaladdr += ppc64_local_entry_offset (map, sym_map, reloc);
+  finaladdr += ppc64_local_entry_offset (map, sym_map, refsym, sym);
   *reloc_addr = finaladdr;
 #endif
 
@@ -543,6 +551,7 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t sym_map,
 
 static inline void __attribute__ ((always_inline))
 elf_machine_plt_conflict (struct link_map *map, lookup_t sym_map,
+                         const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                          const Elf64_Rela *reloc,
                          Elf64_Addr *reloc_addr, Elf64_Addr finaladdr)
 {
@@ -565,7 +574,7 @@ elf_machine_plt_conflict (struct link_map *map, lookup_t sym_map,
   PPC_DCBST (&plt->fd_toc);
   PPC_SYNC;
 #else
-  finaladdr += ppc64_local_entry_offset (map, sym_map, reloc);
+  finaladdr += ppc64_local_entry_offset (map, sym_map, refsym, sym);
   *reloc_addr = finaladdr;
 #endif
 }
@@ -604,11 +613,10 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
 
 #define dont_expect(X) __builtin_expect ((X), 0)
 
-extern void _dl_reloc_overflow (struct link_map *map,
-                               const char *name,
-                               Elf64_Addr *const reloc_addr,
-                               const Elf64_Sym *refsym)
-                               attribute_hidden;
+extern void attribute_hidden _dl_reloc_overflow (struct link_map *map,
+                                                const char *name,
+                                                Elf64_Addr *const reloc_addr,
+                                                const Elf64_Sym *refsym);
 
 auto inline void __attribute__ ((always_inline))
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
@@ -728,9 +736,11 @@ elf_machine_rela (struct link_map *map,
       /* Fall thru */
     case R_PPC64_JMP_SLOT:
 #ifdef RESOLVE_CONFLICT_FIND_MAP
-      elf_machine_plt_conflict (map, sym_map, reloc, reloc_addr, value);
+      elf_machine_plt_conflict (map, sym_map, refsym, sym,
+                               reloc, reloc_addr, value);
 #else
-      elf_machine_fixup_plt (map, sym_map, reloc, reloc_addr, value);
+      elf_machine_fixup_plt (map, sym_map, refsym, sym,
+                            reloc, reloc_addr, value);
 #endif
       return;
 
index 2e3c77c58e88bb119fdec3784cfbbd04057c7a2b..c302c9d2ce7ca0532380bc721c781f15840298a4 100644 (file)
@@ -294,6 +294,7 @@ dl_platform_init (void)
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rela *reloc,
                       Elf32_Addr *reloc_addr, Elf32_Addr value)
 {
index f2aeb1e78e5961f62c7dabe15081260b471771b6..75135204179acfd1caf536862d4b4e73f3aaa7f9 100644 (file)
@@ -242,6 +242,7 @@ dl_platform_init (void)
 
 static inline Elf64_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf64_Rela *reloc,
                       Elf64_Addr *reloc_addr, Elf64_Addr value)
 {
index 2b468af6fa1f44b3610797e282c45d5702ea74e3..7106afbdbd5d530255ae41fb5ce954b83fae8993 100644 (file)
@@ -230,6 +230,7 @@ dl_platform_init (void)
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rela *reloc,
                       Elf32_Addr *reloc_addr, Elf32_Addr value)
 {
index 95f673270e79e580ffe9581f05b93a50fe695059..436e4e6cc3e33a66ec4d9e41affa7f2788e9d1bc 100644 (file)
@@ -294,6 +294,7 @@ _dl_start_user:\n\
 
 static inline Elf32_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf32_Rela *reloc,
                       Elf32_Addr *reloc_addr, Elf32_Addr value)
 {
index 1b59d78a25149bae32fd0ebc1c2ee385180a3a56..c2871dca3ab6b25532acbf8f8d24ad288b734a68 100644 (file)
@@ -85,6 +85,7 @@ elf_machine_load_address (void)
 
 static inline Elf64_Addr __attribute__ ((always_inline))
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const Elf64_Rela *reloc,
                       Elf64_Addr *reloc_addr, Elf64_Addr value)
 {
index c1d784548cb011bc2461795e201c02011dca29dc..ae92673ac80634069affec6d9ce395a8c2ba07e6 100644 (file)
@@ -239,6 +239,7 @@ dl_platform_init (void)
 
 static inline ElfW(Addr)
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const ElfW(Rela) *reloc,
                       ElfW(Addr) *reloc_addr, ElfW(Addr) value)
 {
@@ -569,7 +570,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
   switch (r_type)
     {
     case R_TILE(JMP_SLOT):
-      elf_machine_fixup_plt (map, 0, reloc, reloc_addr,
+      elf_machine_fixup_plt (map, 0, 0, 0, reloc, reloc_addr,
                              value + reloc->r_addend);
       return;
 
index 0015db4d6a406872fe5235ab4322ee61cc8dee77..6a04cbcdc98da4363719892bde060b5e7adb97d4 100644 (file)
@@ -253,6 +253,7 @@ dl_platform_init (void)
 
 static inline ElfW(Addr)
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+                      const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
                       const ElfW(Rela) *reloc,
                       ElfW(Addr) *reloc_addr, ElfW(Addr) value)
 {