Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/gpl3/binutils/dist/bfd Two fixes. Better PLT pruni...



details:   https://anonhg.NetBSD.org/src/rev/d9393d191507
branches:  trunk
changeset: 780246:d9393d191507
user:      matt <matt%NetBSD.org@localhost>
date:      Tue Jul 17 21:37:21 2012 +0000

description:
Two fixes.  Better PLT pruning (don't emit PLTs for local functions).
If emitting a reloc against a readonly section in a shared image,
cause TEXTREL to be set.

diffstat:

 external/gpl3/binutils/dist/bfd/elf32-vax.c |  51 +++++++++-------------------
 1 files changed, 17 insertions(+), 34 deletions(-)

diffs (75 lines):

diff -r 40c2478bc13e -r d9393d191507 external/gpl3/binutils/dist/bfd/elf32-vax.c
--- a/external/gpl3/binutils/dist/bfd/elf32-vax.c       Tue Jul 17 21:35:26 2012 +0000
+++ b/external/gpl3/binutils/dist/bfd/elf32-vax.c       Tue Jul 17 21:37:21 2012 +0000
@@ -973,39 +973,21 @@
   if (h->type == STT_FUNC
       || h->needs_plt)
     {
-      if (! info->shared
-         && !h->def_dynamic
-         && !h->ref_dynamic
-         /* We must always create the plt entry if it was referenced
-            by a PLTxxO relocation.  In this case we already recorded
-            it as a dynamic symbol.  */
-         && h->dynindx == -1)
+      if (h->plt.refcount == 0
+         || SYMBOL_CALLS_LOCAL (info, 0)
+         || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+             && h->root.type == bfd_link_hash_undefweak))
        {
          /* This case can occur if we saw a PLTxx reloc in an input
             file, but the symbol was never referred to by a dynamic
-            object.  In such a case, we don't actually need to build
-            a procedure linkage table, and we can just do a PCxx
-            reloc instead.  */
-         BFD_ASSERT (h->needs_plt);
+            object, or if all references were garbage collected..  In
+            such a case, we don't actually need to build a procedure
+            linkage table, and we can just do a PCxx reloc instead.  */
          h->plt.offset = (bfd_vma) -1;
+         h->needs_plt = 0;
          return TRUE;
        }
 
-      /* GC may have rendered this entry unused.  */
-      if (h->plt.refcount <= 0)
-       {
-         h->needs_plt = 0;
-         h->plt.offset = (bfd_vma) -1;
-         return TRUE;
-       }
-
-      /* Make sure this symbol is output as a dynamic symbol.  */
-      if (h->dynindx == -1)
-       {
-         if (! bfd_elf_link_record_dynamic_symbol (info, h))
-           return FALSE;
-       }
-
       s = bfd_get_section_by_name (dynobj, ".plt");
       BFD_ASSERT (s != NULL);
 
@@ -1751,14 +1733,15 @@
                    }
                }
 
-             if (strcmp (bfd_get_section_name (input_bfd, input_section),
-                          ".text") == 0 ||
-                 (info->shared
-                  && ELF32_R_TYPE(outrel.r_info) != R_VAX_32
-                  && ELF32_R_TYPE(outrel.r_info) != R_VAX_RELATIVE
-                  && ELF32_R_TYPE(outrel.r_info) != R_VAX_COPY
-                  && ELF32_R_TYPE(outrel.r_info) != R_VAX_JMP_SLOT
-                  && ELF32_R_TYPE(outrel.r_info) != R_VAX_GLOB_DAT))
+             if (input_section->flags & SEC_READONLY)
+                info->flags |= DF_TEXTREL;
+
+             if (input_section->flags & SEC_READONLY
+                 || (ELF32_R_TYPE(outrel.r_info) != R_VAX_32
+                     && ELF32_R_TYPE(outrel.r_info) != R_VAX_RELATIVE
+                     && ELF32_R_TYPE(outrel.r_info) != R_VAX_COPY
+                     && ELF32_R_TYPE(outrel.r_info) != R_VAX_JMP_SLOT
+                     && ELF32_R_TYPE(outrel.r_info) != R_VAX_GLOB_DAT))
                {
                  if (h != NULL)
                    (*_bfd_error_handler)



Home | Main Index | Thread Index | Old Index