PR ld/10144
authorMaciej W. Rozycki <macro@linux-mips.org>
Thu, 4 Nov 2010 18:00:54 +0000 (18:00 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Thu, 4 Nov 2010 18:00:54 +0000 (18:00 +0000)
* elfxx-mips.c (_bfd_mips_elf_check_relocs)
[R_MIPS_32, R_MIPS_REL32, R_MIPS_64]: Ignore relocs from
SEC_DEBUGGING sections.

bfd/ChangeLog
bfd/elfxx-mips.c

index f18a7ddf7f87413dfcaa14f34f6cefd504ead4e2..50d311dfed04dc0753bf4feb3954398a12264510 100644 (file)
@@ -1,3 +1,10 @@
+2010-11-04  Maciej W. Rozycki  <macro@codesourcery.com>
+
+       PR ld/10144
+       * elfxx-mips.c (_bfd_mips_elf_check_relocs)
+       [R_MIPS_32, R_MIPS_REL32, R_MIPS_64]: Ignore relocs from
+       SEC_DEBUGGING sections.
+
 2010-11-04  Tristan Gingold  <gingold@adacore.com>
 
        * vms-lib.c (vms_write_index): Fix thinko: reverse the loop.
index bed8ed1ff08e2f1d89e671294414aafb4d79bf0a..4718dd4db6734c19b4ff007113558d3105e11adc 100644 (file)
@@ -7583,6 +7583,25 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
                elf_hash_table (info)->dynobj = dynobj = abfd;
              break;
            }
+         /* For sections that are not SEC_ALLOC a copy reloc would be
+            output if possible (implying questionable semantics for
+            read-only data objects) or otherwise the final link would
+            fail as ld.so will not process them and could not therefore
+            handle any outstanding dynamic relocations.
+
+            For such sections that are also SEC_DEBUGGING, we can avoid
+            these problems by simply ignoring any relocs as these
+            sections have a predefined use and we know it is safe to do
+            so.
+
+            This is needed in cases such as a global symbol definition
+            in a shared library causing a common symbol from an object
+            file to be converted to an undefined reference.  If that
+            happens, then all the relocations against this symbol from
+            SEC_DEBUGGING sections in the object file will resolve to
+            nil.  */
+         if ((sec->flags & SEC_DEBUGGING) != 0)
+           break;
          /* Fall through.  */
 
        default: