* elf64-ppc.c (ppc64_elf_edit_toc): Clear "repeat" inside
[deliverable/binutils-gdb.git] / bfd / elf32-arm.c
index 7083422309f3987e2184db8468a70fc8b4f6614b..fefc7db0c1e7e6c90c3788a9550df4e9b2e33c74 100644 (file)
@@ -11327,6 +11327,24 @@ tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out,
       T(V7E_M),  /* V6S_M.  */
       T(V7E_M)   /* V7E_M.  */
     };
+  const int v8[] =
+    {
+      T(V8),           /* PRE_V4.  */
+      T(V8),           /* V4.  */
+      T(V8),           /* V4T.  */
+      T(V8),           /* V5T.  */
+      T(V8),           /* V5TE.  */
+      T(V8),           /* V5TEJ.  */
+      T(V8),           /* V6.  */
+      T(V8),           /* V6KZ.  */
+      T(V8),           /* V6T2.  */
+      T(V8),           /* V6K.  */
+      T(V8),           /* V7.  */
+      T(V8),           /* V6_M.  */
+      T(V8),           /* V6S_M.  */
+      T(V8),           /* V7E_M.  */
+      T(V8)            /* V8.  */
+    };
   const int v4t_plus_v6_m[] =
     {
       -1,              /* PRE_V4.  */
@@ -11343,6 +11361,7 @@ tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out,
       T(V6_M),         /* V6_M.  */
       T(V6S_M),                /* V6S_M.  */
       T(V7E_M),                /* V7E_M.  */
+      T(V8),           /* V8.  */
       T(V4T_PLUS_V6_M) /* V4T plus V6_M.  */
     };
   const int *comb[] =
@@ -11353,6 +11372,7 @@ tag_cpu_arch_combine (bfd *ibfd, int oldtag, int *secondary_compat_out,
       v6_m,
       v6s_m,
       v7e_m,
+      v8,
       /* Pseudo-architecture.  */
       v4t_plus_v6_m
     };
@@ -11554,7 +11574,8 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
                "ARM v6K",
                "ARM v7",
                "ARM v6-M",
-               "ARM v6S-M"
+               "ARM v6S-M",
+               "ARM v8"
            };
 
            /* Merge Tag_CPU_arch and Tag_also_compatible_with.  */
@@ -11699,11 +11720,12 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
                 when it's 0.  It might mean absence of FP hardware if
                 Tag_FP_arch is zero, otherwise it is effectively SP + DP.  */
 
+#define VFP_VERSION_COUNT 8
              static const struct
              {
                  int ver;
                  int regs;
-             } vfp_versions[7] =
+             } vfp_versions[VFP_VERSION_COUNT] =
                {
                  {0, 0},
                  {1, 16},
@@ -11711,7 +11733,8 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
                  {3, 32},
                  {3, 16},
                  {4, 32},
-                 {4, 16}
+                 {4, 16},
+                 {8, 32}
                };
              int ver;
              int regs;
@@ -11751,9 +11774,10 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
 
              /* Now we can handle Tag_FP_arch.  */
 
-             /* Values greater than 6 aren't defined, so just pick the
-                biggest */
-             if (in_attr[i].i > 6 && in_attr[i].i > out_attr[i].i)
+             /* Values of VFP_VERSION_COUNT or more aren't defined, so just
+                pick the biggest.  */
+             if (in_attr[i].i >= VFP_VERSION_COUNT
+                 && in_attr[i].i > out_attr[i].i)
                {
                  out_attr[i] = in_attr[i];
                  break;
@@ -11768,7 +11792,7 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
                regs = vfp_versions[out_attr[i].i].regs;
              /* This assumes all possible supersets are also a valid
                 options.  */
-             for (newval = 6; newval > 0; newval--)
+             for (newval = VFP_VERSION_COUNT - 1; newval > 0; newval--)
                {
                  if (regs == vfp_versions[newval].regs
                      && ver == vfp_versions[newval].ver)
@@ -12086,6 +12110,15 @@ elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
 
     case EF_ARM_EABI_VER5:
       fprintf (file, _(" [Version5 EABI]"));
+
+      if (flags & EF_ARM_ABI_FLOAT_SOFT)
+       fprintf (file, _(" [soft-float ABI]"));
+
+      if (flags & EF_ARM_ABI_FLOAT_HARD)
+       fprintf (file, _(" [hard-float ABI]"));
+
+      flags &= ~(EF_ARM_ABI_FLOAT_SOFT | EF_ARM_ABI_FLOAT_HARD);
+
     eabi:
       if (flags & EF_ARM_BE8)
        fprintf (file, _(" [BE8]"));
@@ -12669,7 +12702,8 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
          /* If the symbol is a function that doesn't bind locally,
             this relocation will need a PLT entry.  */
-         root_plt->refcount += 1;
+         if (root_plt->refcount != -1)
+           root_plt->refcount += 1;
 
          if (!call_reloc_p)
            arm_plt->noncall_refcount++;
@@ -12885,7 +12919,7 @@ elf32_arm_find_nearest_line (bfd *          abfd,
   if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
                                      section, symbols, offset,
                                     filename_ptr, functionname_ptr,
-                                    line_ptr, 0,
+                                    line_ptr, NULL, 0,
                                     & elf_tdata (abfd)->dwarf2_find_line_info))
     {
       if (!*functionname_ptr)
@@ -13978,7 +14012,7 @@ elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
      the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
      to the ".got" section.  */
-  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
+  if (h == htab->root.hdynamic
       || (!htab->vxworks_p && h == htab->root.hgot))
     sym->st_shndx = SHN_ABS;
 
@@ -14082,7 +14116,14 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
              name = RELOC_SECTION (htab, ".plt");
            get_vma:
              s = bfd_get_section_by_name (output_bfd, name);
-             BFD_ASSERT (s != NULL);
+             if (s == NULL)
+               {
+                 /* PR ld/14397: Issue an error message if a required section is missing.  */
+                 (*_bfd_error_handler)
+                   (_("error: required section '%s' not found in the linker script"), name);
+                 bfd_set_error (bfd_error_invalid_operation);
+                 return FALSE;
+               }
              if (!htab->symbian_p)
                dyn.d_un.d_ptr = s->vma;
              else
@@ -14385,6 +14426,16 @@ elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATT
       if (globals != NULL && globals->byteswap_code)
        i_ehdrp->e_flags |= EF_ARM_BE8;
     }
+
+  if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_VER5
+      && ((i_ehdrp->e_type == ET_DYN) || (i_ehdrp->e_type == ET_EXEC)))
+    {
+      int abi = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC, Tag_ABI_VFP_args);
+      if (abi)
+       i_ehdrp->e_flags |= EF_ARM_ABI_FLOAT_HARD;
+      else
+       i_ehdrp->e_flags |= EF_ARM_ABI_FLOAT_SOFT;
+    }
 }
 
 static enum elf_reloc_type_class
This page took 0.036127 seconds and 4 git commands to generate.