Fix PR gdb/20948: --write option to GDB causes segmentation fault
[deliverable/binutils-gdb.git] / bfd / elf32-arc.c
index f6c6a8c4ed64afec8e755be823de35588a034c40..62366a7dd2c76b735f67e3bbe75a5eb66ff2bc6a 100644 (file)
@@ -505,16 +505,25 @@ bfd_elf32_bfd_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED,
 
 /* Set the howto pointer for an ARC ELF reloc.  */
 
-static void
-arc_info_to_howto_rel (bfd * abfd ATTRIBUTE_UNUSED,
+static bfd_boolean
+arc_info_to_howto_rel (bfd * abfd,
                       arelent * cache_ptr,
                       Elf_Internal_Rela * dst)
 {
   unsigned int r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
-  BFD_ASSERT (r_type < (unsigned int) R_ARC_max);
+  if (r_type >= (unsigned int) R_ARC_max)
+    {
+      /* xgettext:c-format */
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      return FALSE;
+    }
+
   cache_ptr->howto = arc_elf_howto (r_type);
+  return TRUE;
 }
 
 /* Extract CPU features from an NTBS.  */
@@ -617,8 +626,8 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
              /* It's sometimes ok to mix different configs, so this is only
                 a warning.  */
              _bfd_error_handler
-               (_("Warning: %pB: Conflicting platform configuration "
-                  "%s with %s.\n"), ibfd,
+               (_("warning: %pB: conflicting platform configuration "
+                  "%s with %s"), ibfd,
                 tagval[in_attr[i].i],
                 tagval[out_attr[i].i]);
            }
@@ -637,7 +646,7 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
              /* We cannot mix code for different CPUs.  */
              _bfd_error_handler
                (_("error: %pB: unable to merge CPU base attributes "
-                  "%s with %s.\n"),
+                  "%s with %s"),
                 obfd,
                 tagval[in_attr[i].i],
                 tagval[out_attr[i].i]);
@@ -674,7 +683,7 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
                  {
                    _bfd_error_handler
                      (_("error: %pB: unable to merge ISA extension attributes "
-                        "%s.\n"),
+                        "%s"),
                       obfd, bfd_feature_list[j].name);
                    result = FALSE;
                    break;
@@ -698,7 +707,7 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
                      }
                    _bfd_error_handler
                      (_("error: %pB: conflicting ISA extension attributes "
-                        "%s with %s.\n"),
+                        "%s with %s"),
                       obfd, p1, p2);
                    result = FALSE;
                    break;
@@ -722,7 +731,12 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
            out_attr[i].i = in_attr[i].i;
          break;
 
+         /* The CPU name is given by the vendor, just choose an
+            existing one if missing or different.  There are no fail
+            criteria if they different or both missing.  */
        case Tag_ARC_CPU_name:
+         if (!out_attr[i].s && in_attr[i].s)
+           out_attr[i].s = _bfd_elf_attr_strdup (obfd, in_attr[i].s);
          break;
 
        case Tag_ARC_ABI_rf16:
@@ -732,7 +746,7 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
            {
              /* We cannot mix code with rf16 and without.  */
              _bfd_error_handler
-               (_("error: %pB: cannot mix rf16 with full register set %pB.\n"),
+               (_("error: %pB: cannot mix rf16 with full register set %pB"),
                 obfd, ibfd);
              result = FALSE;
            }
@@ -754,11 +768,13 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
 
            BFD_ASSERT (in_attr[i].i < 3);
            BFD_ASSERT (out_attr[i].i < 3);
-           if (out_attr[i].i != 0 && in_attr[i].i != 0
+           if (out_attr[i].i == 0)
+             out_attr[i].i = in_attr[i].i;
+           else if (out_attr[i].i != 0 && in_attr[i].i != 0
                && out_attr[i].i != in_attr[i].i)
              {
                _bfd_error_handler
-                 (_("error: %pB: conflicting attributes %s: %s with %s.\n"),
+                 (_("error: %pB: conflicting attributes %s: %s with %s"),
                   obfd, tagname,
                   tagval[in_attr[i].i],
                   tagval[out_attr[i].i]);
@@ -779,11 +795,13 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
          if (!tagname)
            tagname = "ABI exceptions";
 
-         if (out_attr[i].i != 0 && in_attr[i].i != 0
+         if (out_attr[i].i == 0)
+           out_attr[i].i = in_attr[i].i;
+         else if (out_attr[i].i != 0 && in_attr[i].i != 0
              && out_attr[i].i != in_attr[i].i)
            {
              _bfd_error_handler
-               (_("error: %pB: conflicting attributes %s.\n"),
+               (_("error: %pB: conflicting attributes %s"),
                 obfd, tagname);
              result = FALSE;
            }
@@ -796,6 +814,11 @@ arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
          /* It is handled in Tag_ARC_CPU_base.  */
          break;
 
+       case Tag_ARC_ATR_version:
+         if (out_attr[i].i == 0)
+           out_attr[i].i = in_attr[i].i;
+         break;
+
        default:
          result
            = result && _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
@@ -883,7 +906,7 @@ arc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
       if (mach_ibfd != mach_obfd)
        {
          /* xgettext:c-format */
-         _bfd_error_handler (_("ERROR: Attempting to link %pB "
+         _bfd_error_handler (_("error: attempting to link %pB "
                                "with a binary %pB of different architecture"),
                              ibfd, obfd);
          return FALSE;
@@ -894,14 +917,16 @@ arc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
               && !bfd_elf_get_obj_attr_int (ibfd, OBJ_ATTR_PROC,
                                             Tag_ARC_CPU_base))
        {
-         /* Warn if different flags.  */
-         _bfd_error_handler
-           /* xgettext:c-format */
-           (_("%pB: uses different e_flags (%#x) fields than "
-              "previous modules (%#x)"),
-            ibfd, in_flags, out_flags);
          if (in_flags && out_flags)
-           return FALSE;
+           {
+             /* Warn if different flags.  */
+             _bfd_error_handler
+               /* xgettext:c-format */
+               (_("%pB: uses different e_flags (%#x) fields than "
+                  "previous modules (%#x)"),
+                ibfd, in_flags, out_flags);
+             return FALSE;
+           }
          /* MWDT doesnt set the eflags hence make sure we choose the
             eflags set by gcc.  */
          in_flags = in_flags > out_flags ? in_flags : out_flags;
@@ -986,14 +1011,14 @@ arc_elf_object_p (bfd * abfd)
       if (e_machine == EM_ARC)
        {
          _bfd_error_handler
-           (_("Error: The ARC4 architecture is no longer supported.\n"));
+           (_("error: the ARC4 architecture is no longer supported"));
          return FALSE;
        }
       else
        {
          _bfd_error_handler
-           (_("Warning: unset or old architecture flags. \n"
-              "               Use default machine.\n"));
+           (_("warning: unset or old architecture flags; "
+              "use default machine"));
        }
     }
 
@@ -1828,7 +1853,7 @@ elf_arc_relocate_section (bfd *                     output_bfd,
          && !reloc_data.sdata_begin_symbol_vma_set)
        {
          _bfd_error_handler
-           ("Error: Linker symbol __SDATA_BEGIN__ not found");
+           ("error: linker symbol __SDATA_BEGIN__ not found");
          bfd_set_error (bfd_error_bad_value);
          return FALSE;
        }
@@ -1841,7 +1866,7 @@ elf_arc_relocate_section (bfd *                     output_bfd,
          && reloc_data.sym_section == NULL)
        {
          _bfd_error_handler
-           (_("GOT and PLT relocations cannot be fixed with a non dynamic linker."));
+           (_("GOT and PLT relocations cannot be fixed with a non dynamic linker"));
          bfd_set_error (bfd_error_bad_value);
          return FALSE;
        }
@@ -1973,11 +1998,11 @@ elf_arc_check_relocs (bfd *                      abfd,
                  name = "UNKNOWN";
                _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("\
-%pB: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
-                   abfd,
-                   arc_elf_howto (r_type)->name,
-                   name);
+                 (_("%pB: relocation %s against `%s' can not be used"
+                    " when making a shared object; recompile with -fPIC"),
+                  abfd,
+                  arc_elf_howto (r_type)->name,
+                  name);
                bfd_set_error (bfd_error_bad_value);
                return FALSE;
              }
@@ -2788,26 +2813,6 @@ const struct elf_size_info arc_elf32_size_info =
 
 #define elf_backend_size_info          arc_elf32_size_info
 
-/* Hook called by the linker routine which adds symbols from an object
-   file.  */
-
-static bfd_boolean
-elf_arc_add_symbol_hook (bfd * abfd,
-                        struct bfd_link_info * info,
-                        Elf_Internal_Sym * sym,
-                        const char ** namep ATTRIBUTE_UNUSED,
-                        flagword * flagsp ATTRIBUTE_UNUSED,
-                        asection ** secp ATTRIBUTE_UNUSED,
-                        bfd_vma * valp ATTRIBUTE_UNUSED)
-{
-  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
-      && (abfd->flags & DYNAMIC) == 0
-      && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
-    elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
-
-  return TRUE;
-}
-
 /* GDB expects general purpose registers to be in section .reg.  However Linux
    kernel doesn't create this section and instead writes registers to NOTE
    section.  It is up to the binutils to create a pseudo-section .reg from the
@@ -2865,7 +2870,7 @@ elf32_arc_obj_attrs_handle_unknown (bfd *abfd, int tag)
   if ((tag & 127) < (Tag_ARC_ISA_mpy_option + 1))
     {
       _bfd_error_handler
-       (_("%pB: Unknown mandatory ARC object attribute %d."),
+       (_("%pB: unknown mandatory ARC object attribute %d"),
         abfd, tag);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
@@ -2873,7 +2878,7 @@ elf32_arc_obj_attrs_handle_unknown (bfd *abfd, int tag)
   else
     {
       _bfd_error_handler
-       (_("Warning: %pB: Unknown ARC object attribute %d."),
+       (_("warning: %pB: unknown ARC object attribute %d"),
         abfd, tag);
       return TRUE;
     }
@@ -2891,6 +2896,7 @@ elf32_arc_section_from_shdr (bfd *abfd,
 {
   switch (hdr->sh_type)
     {
+    case 0x0c: /* MWDT specific section, don't complain about it.  */
     case SHT_ARC_ATTRIBUTES:
       break;
 
@@ -2937,7 +2943,6 @@ elf32_arc_section_from_shdr (bfd *abfd,
 
 #define elf_backend_finish_dynamic_sections  elf_arc_finish_dynamic_sections
 #define elf_backend_size_dynamic_sections    elf_arc_size_dynamic_sections
-#define elf_backend_add_symbol_hook         elf_arc_add_symbol_hook
 
 #define elf_backend_can_gc_sections    1
 #define elf_backend_want_got_plt       1
This page took 0.028074 seconds and 4 git commands to generate.