* elf64-ppc.c (ppc64_elf_relocate_section): Provide section/offset
[deliverable/binutils-gdb.git] / bfd / elfxx-mips.c
index 8feb5c483794d022a43631e75c1aa740483ae502..d5e99bbb204ce79f4ece14dcb22fc06688904466 100644 (file)
@@ -5152,7 +5152,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
       addend = 0;
     }
 
-  /* If we haven't already determined the GOT offset, oand we're going
+  /* If we haven't already determined the GOT offset, and we're going
      to need it, get it now.  */
   switch (r_type)
     {
@@ -5946,6 +5946,9 @@ _bfd_elf_mips_mach (flagword flags)
     case E_MIPS_MACH_LS2F:
       return bfd_mach_mips_loongson_2f;
 
+    case E_MIPS_MACH_LS3A:
+      return bfd_mach_mips_loongson_3a;
+
     case E_MIPS_MACH_OCTEON:
       return bfd_mach_mips_octeon;
 
@@ -7583,6 +7586,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:
@@ -9000,15 +9022,8 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        }
 
       if (sec != NULL && elf_discarded_section (sec))
-       {
-         /* For relocs against symbols from removed linkonce sections,
-            or sections discarded by a linker script, we just want the
-            section contents zeroed.  Avoid any special processing.  */
-         _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-         rel->r_info = 0;
-         rel->r_addend = 0;
-         continue;
-       }
+       RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+                                        rel, relend, howto, contents);
 
       if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
        {
@@ -10548,6 +10563,10 @@ mips_set_isa_flags (bfd *abfd)
       val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
       break;
 
+    case bfd_mach_mips_loongson_3a:
+      val = E_MIPS_ARCH_64 | E_MIPS_MACH_LS3A;
+      break;
+
     case bfd_mach_mips_octeon:
       val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON;
       break;
@@ -12246,6 +12265,7 @@ static const struct mips_mach_extension mips_mach_extensions[] = {
   { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
   { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
   { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
+  { bfd_mach_mips_loongson_3a, bfd_mach_mipsisa64 },
 
   /* MIPS V extensions.  */
   { bfd_mach_mipsisa64, bfd_mach_mips5 },
@@ -12577,8 +12597,11 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   for (sec = ibfd->sections; sec != NULL; sec = sec->next)
     {
       /* Ignore synthetic sections and empty .text, .data and .bss sections
-         which are automatically generated by gas.  */
-      if (strcmp (sec->name, ".reginfo")
+        which are automatically generated by gas.  Also ignore fake
+        (s)common sections, since merely defining a common symbol does
+        not affect compatibility.  */
+      if ((sec->flags & SEC_IS_COMMON) == 0
+         && strcmp (sec->name, ".reginfo")
          && strcmp (sec->name, ".mdebug")
          && (sec->size != 0
              || (strcmp (sec->name, ".text")
This page took 0.025284 seconds and 4 git commands to generate.