Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / elf32-metag.c
index 3a80cb361a4f7b9f3643506aa18cd52b6c12076d..44923edc7b4fc1335eeb4cff35389306b38a6a77 100644 (file)
@@ -1,5 +1,5 @@
 /* Meta support for 32-bit ELF
 /* Meta support for 32-bit ELF
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
+   Copyright (C) 2013-2020 Free Software Foundation, Inc.
    Contributed by Imagination Technologies Ltd.
 
    This file is part of BFD, the Binary File Descriptor library.
    Contributed by Imagination Technologies Ltd.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -73,20 +73,18 @@ static const unsigned int plt_pic_entry[] =
 /* Variable names follow a coding style.
    Please follow this (Apps Hungarian) style:
 
 /* Variable names follow a coding style.
    Please follow this (Apps Hungarian) style:
 
-   Structure/Variable              Prefix
-   elf_link_hash_table             "etab"
-   elf_link_hash_entry             "eh"
+   Structure/Variable             Prefix
+   elf_link_hash_table            "etab"
+   elf_link_hash_entry            "eh"
 
 
-   elf_metag_link_hash_table       "htab"
-   elf_metag_link_hash_entry       "hh"
+   elf_metag_link_hash_table      "htab"
+   elf_metag_link_hash_entry      "hh"
 
 
-   bfd_link_hash_table             "btab"
-   bfd_link_hash_entry             "bh"
+   bfd_link_hash_table            "btab"
+   bfd_link_hash_entry            "bh"
 
    bfd_hash_table containing stubs "bstab"
 
    bfd_hash_table containing stubs "bstab"
-   elf_metag_stub_hash_entry       "hsh"
-
-   elf_metag_dyn_reloc_entry       "hdh"
+   elf_metag_stub_hash_entry      "hsh"
 
    Always remember to use GNU Coding Style.  */
 
 
    Always remember to use GNU Coding Style.  */
 
@@ -701,44 +699,44 @@ struct metag_reloc_map
 
 static const struct metag_reloc_map metag_reloc_map [] =
   {
 
 static const struct metag_reloc_map metag_reloc_map [] =
   {
-    { BFD_RELOC_NONE,                R_METAG_NONE },
-    { BFD_RELOC_32,                  R_METAG_ADDR32 },
-    { BFD_RELOC_METAG_HIADDR16,      R_METAG_HIADDR16 },
-    { BFD_RELOC_METAG_LOADDR16,      R_METAG_LOADDR16 },
+    { BFD_RELOC_NONE,               R_METAG_NONE },
+    { BFD_RELOC_32,                 R_METAG_ADDR32 },
+    { BFD_RELOC_METAG_HIADDR16,             R_METAG_HIADDR16 },
+    { BFD_RELOC_METAG_LOADDR16,             R_METAG_LOADDR16 },
     { BFD_RELOC_METAG_RELBRANCH,     R_METAG_RELBRANCH },
     { BFD_RELOC_METAG_GETSETOFF,     R_METAG_GETSETOFF },
     { BFD_RELOC_METAG_RELBRANCH,     R_METAG_RELBRANCH },
     { BFD_RELOC_METAG_GETSETOFF,     R_METAG_GETSETOFF },
-    { BFD_RELOC_VTABLE_INHERIT,      R_METAG_GNU_VTINHERIT },
-    { BFD_RELOC_VTABLE_ENTRY,        R_METAG_GNU_VTENTRY },
-    { BFD_RELOC_METAG_REL8,          R_METAG_REL8 },
-    { BFD_RELOC_METAG_REL16,         R_METAG_REL16 },
+    { BFD_RELOC_VTABLE_INHERIT,             R_METAG_GNU_VTINHERIT },
+    { BFD_RELOC_VTABLE_ENTRY,       R_METAG_GNU_VTENTRY },
+    { BFD_RELOC_METAG_REL8,         R_METAG_REL8 },
+    { BFD_RELOC_METAG_REL16,        R_METAG_REL16 },
     { BFD_RELOC_METAG_HI16_GOTOFF,   R_METAG_HI16_GOTOFF },
     { BFD_RELOC_METAG_LO16_GOTOFF,   R_METAG_LO16_GOTOFF },
     { BFD_RELOC_METAG_GETSET_GOTOFF, R_METAG_GETSET_GOTOFF },
     { BFD_RELOC_METAG_GETSET_GOT,    R_METAG_GETSET_GOT },
     { BFD_RELOC_METAG_HI16_GOTPC,    R_METAG_HI16_GOTPC },
     { BFD_RELOC_METAG_LO16_GOTPC,    R_METAG_LO16_GOTPC },
     { BFD_RELOC_METAG_HI16_GOTOFF,   R_METAG_HI16_GOTOFF },
     { BFD_RELOC_METAG_LO16_GOTOFF,   R_METAG_LO16_GOTOFF },
     { BFD_RELOC_METAG_GETSET_GOTOFF, R_METAG_GETSET_GOTOFF },
     { BFD_RELOC_METAG_GETSET_GOT,    R_METAG_GETSET_GOT },
     { BFD_RELOC_METAG_HI16_GOTPC,    R_METAG_HI16_GOTPC },
     { BFD_RELOC_METAG_LO16_GOTPC,    R_METAG_LO16_GOTPC },
-    { BFD_RELOC_METAG_HI16_PLT,      R_METAG_HI16_PLT },
-    { BFD_RELOC_METAG_LO16_PLT,      R_METAG_LO16_PLT },
+    { BFD_RELOC_METAG_HI16_PLT,             R_METAG_HI16_PLT },
+    { BFD_RELOC_METAG_LO16_PLT,             R_METAG_LO16_PLT },
     { BFD_RELOC_METAG_RELBRANCH_PLT, R_METAG_RELBRANCH_PLT },
     { BFD_RELOC_METAG_RELBRANCH_PLT, R_METAG_RELBRANCH_PLT },
-    { BFD_RELOC_METAG_GOTOFF,        R_METAG_GOTOFF },
-    { BFD_RELOC_METAG_PLT,           R_METAG_PLT },
-    { BFD_RELOC_METAG_COPY,          R_METAG_COPY },
-    { BFD_RELOC_METAG_JMP_SLOT,      R_METAG_JMP_SLOT },
-    { BFD_RELOC_METAG_RELATIVE,      R_METAG_RELATIVE },
-    { BFD_RELOC_METAG_GLOB_DAT,      R_METAG_GLOB_DAT },
-    { BFD_RELOC_METAG_TLS_GD,        R_METAG_TLS_GD },
-    { BFD_RELOC_METAG_TLS_LDM,       R_METAG_TLS_LDM },
+    { BFD_RELOC_METAG_GOTOFF,       R_METAG_GOTOFF },
+    { BFD_RELOC_METAG_PLT,          R_METAG_PLT },
+    { BFD_RELOC_METAG_COPY,         R_METAG_COPY },
+    { BFD_RELOC_METAG_JMP_SLOT,             R_METAG_JMP_SLOT },
+    { BFD_RELOC_METAG_RELATIVE,             R_METAG_RELATIVE },
+    { BFD_RELOC_METAG_GLOB_DAT,             R_METAG_GLOB_DAT },
+    { BFD_RELOC_METAG_TLS_GD,       R_METAG_TLS_GD },
+    { BFD_RELOC_METAG_TLS_LDM,      R_METAG_TLS_LDM },
     { BFD_RELOC_METAG_TLS_LDO_HI16,  R_METAG_TLS_LDO_HI16 },
     { BFD_RELOC_METAG_TLS_LDO_LO16,  R_METAG_TLS_LDO_LO16 },
     { BFD_RELOC_METAG_TLS_LDO_HI16,  R_METAG_TLS_LDO_HI16 },
     { BFD_RELOC_METAG_TLS_LDO_LO16,  R_METAG_TLS_LDO_LO16 },
-    { BFD_RELOC_METAG_TLS_LDO,       R_METAG_TLS_LDO },
-    { BFD_RELOC_METAG_TLS_IE,        R_METAG_TLS_IE },
+    { BFD_RELOC_METAG_TLS_LDO,      R_METAG_TLS_LDO },
+    { BFD_RELOC_METAG_TLS_IE,       R_METAG_TLS_IE },
     { BFD_RELOC_METAG_TLS_IENONPIC,  R_METAG_TLS_IENONPIC },
     { BFD_RELOC_METAG_TLS_IENONPIC_HI16, R_METAG_TLS_IENONPIC_HI16 },
     { BFD_RELOC_METAG_TLS_IENONPIC_LO16, R_METAG_TLS_IENONPIC_LO16 },
     { BFD_RELOC_METAG_TLS_TPOFF,     R_METAG_TLS_TPOFF },
     { BFD_RELOC_METAG_TLS_DTPMOD,    R_METAG_TLS_DTPMOD },
     { BFD_RELOC_METAG_TLS_DTPOFF,    R_METAG_TLS_DTPOFF },
     { BFD_RELOC_METAG_TLS_IENONPIC,  R_METAG_TLS_IENONPIC },
     { BFD_RELOC_METAG_TLS_IENONPIC_HI16, R_METAG_TLS_IENONPIC_HI16 },
     { BFD_RELOC_METAG_TLS_IENONPIC_LO16, R_METAG_TLS_IENONPIC_LO16 },
     { BFD_RELOC_METAG_TLS_TPOFF,     R_METAG_TLS_TPOFF },
     { BFD_RELOC_METAG_TLS_DTPMOD,    R_METAG_TLS_DTPMOD },
     { BFD_RELOC_METAG_TLS_DTPOFF,    R_METAG_TLS_DTPOFF },
-    { BFD_RELOC_METAG_TLS_LE,        R_METAG_TLS_LE },
+    { BFD_RELOC_METAG_TLS_LE,       R_METAG_TLS_LE },
     { BFD_RELOC_METAG_TLS_LE_HI16,   R_METAG_TLS_LE_HI16 },
     { BFD_RELOC_METAG_TLS_LE_LO16,   R_METAG_TLS_LE_LO16 },
   };
     { BFD_RELOC_METAG_TLS_LE_HI16,   R_METAG_TLS_LE_HI16 },
     { BFD_RELOC_METAG_TLS_LE_LO16,   R_METAG_TLS_LE_LO16 },
   };
@@ -789,20 +787,7 @@ struct elf_metag_link_hash_entry
 
   /* Used to count relocations for delayed sizing of relocation
      sections.  */
 
   /* Used to count relocations for delayed sizing of relocation
      sections.  */
-  struct elf_metag_dyn_reloc_entry {
-
-    /* Next relocation in the chain.  */
-    struct elf_metag_dyn_reloc_entry *hdh_next;
-
-    /* The input section of the reloc.  */
-    asection *sec;
-
-    /* Number of relocs copied in this section.  */
-    bfd_size_type count;
-
-    /* Number of relative relocs copied for the input section.  */
-    bfd_size_type relative_count;
-  } *dyn_relocs;
+  struct elf_dyn_relocs *dyn_relocs;
 
   enum
     {
 
   enum
     {
@@ -879,8 +864,8 @@ tpoff (struct bfd_link_info *info, bfd_vma address)
                         elf_hash_table (info)->tls_sec->alignment_power));
 }
 
                         elf_hash_table (info)->tls_sec->alignment_power));
 }
 
-static void
-metag_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
+static bfd_boolean
+metag_info_to_howto_rela (bfd *abfd,
                          arelent *cache_ptr,
                          Elf_Internal_Rela *dst)
 {
                          arelent *cache_ptr,
                          Elf_Internal_Rela *dst)
 {
@@ -890,10 +875,13 @@ metag_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   if (r_type >= (unsigned int) R_METAG_MAX)
     {
       /* xgettext:c-format */
   if (r_type >= (unsigned int) R_METAG_MAX)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: invalid METAG reloc number: %d"), abfd, r_type);
-      r_type = 0;
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      return FALSE;
     }
   cache_ptr->howto = & elf_metag_howto_table [r_type];
     }
   cache_ptr->howto = & elf_metag_howto_table [r_type];
+  return TRUE;
 }
 
 static reloc_howto_type *
 }
 
 static reloc_howto_type *
@@ -1033,7 +1021,7 @@ static struct bfd_link_hash_table *
 elf_metag_link_hash_table_create (bfd *abfd)
 {
   struct elf_metag_link_hash_table *htab;
 elf_metag_link_hash_table_create (bfd *abfd)
 {
   struct elf_metag_link_hash_table *htab;
-  bfd_size_type amt = sizeof (*htab);
+  size_t amt = sizeof (*htab);
 
   htab = bfd_zmalloc (amt);
   if (htab == NULL)
 
   htab = bfd_zmalloc (amt);
   if (htab == NULL)
@@ -1195,7 +1183,7 @@ metag_add_stub (const char *stub_name,
   if (hsh == NULL)
     {
       /* xgettext:c-format */
   if (hsh == NULL)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: cannot create stub entry %s"),
+      _bfd_error_handler (_("%pB: cannot create stub entry %s"),
                          section->owner, stub_name);
       return NULL;
     }
                          section->owner, stub_name);
       return NULL;
     }
@@ -1408,7 +1396,7 @@ metag_final_link_relocate (reloc_howto_type *howto,
                                              rel, relend, howto, contents) \
   {                                                                    \
     _bfd_clear_contents (howto, input_bfd, input_section,              \
                                              rel, relend, howto, contents) \
   {                                                                    \
     _bfd_clear_contents (howto, input_bfd, input_section,              \
-                        contents + rel->r_offset);                     \
+                        contents, rel->r_offset);                      \
                                                                        \
     if (bfd_link_relocatable (info)                                    \
        && (input_section->flags & SEC_DEBUGGING))                      \
                                                                        \
     if (bfd_link_relocatable (info)                                    \
        && (input_section->flags & SEC_DEBUGGING))                      \
@@ -1531,7 +1519,7 @@ elf_metag_relocate_section (bfd *output_bfd,
 
          name = bfd_elf_string_from_elf_section
            (input_bfd, symtab_hdr->sh_link, sym->st_name);
 
          name = bfd_elf_string_from_elf_section
            (input_bfd, symtab_hdr->sh_link, sym->st_name);
-         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+         name = name == NULL ? bfd_section_name (sec) : name;
        }
       else
        {
        }
       else
        {
@@ -1872,10 +1860,10 @@ elf_metag_relocate_section (bfd *output_bfd,
                        /* We don't support changing the TLS model.  */
                        /* PR 20675 */
                        if (bfd_link_pic (info))
                        /* We don't support changing the TLS model.  */
                        /* PR 20675 */
                        if (bfd_link_pic (info))
-                         _bfd_error_handler (_("%B(%A): multiple TLS models are not supported"),
+                         _bfd_error_handler (_("%pB(%pA): multiple TLS models are not supported"),
                                              input_bfd, input_section);
                        else
                                              input_bfd, input_section);
                        else
-                         _bfd_error_handler (_("%B(%A): shared library symbol %s encountered whilst performing a static link"),
+                         _bfd_error_handler (_("%pB(%pA): shared library symbol %s encountered whilst performing a static link"),
                                              input_bfd, input_section, name);
                        return FALSE;
                      }
                                              input_bfd, input_section, name);
                        return FALSE;
                      }
@@ -1928,8 +1916,10 @@ elf_metag_relocate_section (bfd *output_bfd,
            {
              _bfd_error_handler
                /* xgettext:c-format */
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B(%A+%#Lx): %s relocation not permitted in shared object"),
-                input_bfd, input_section, rel->r_offset, howto->name);
+               (_("%pB(%pA+%#" PRIx64 "): "
+                  "%s relocation not permitted in shared object"),
+                input_bfd, input_section, (uint64_t) rel->r_offset,
+                howto->name);
              return FALSE;
            }
          else
              return FALSE;
            }
          else
@@ -2264,7 +2254,7 @@ elf_metag_check_relocs (bfd *abfd,
                name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
              _bfd_error_handler
                /* xgettext:c-format */
                name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
+               (_("%pB: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
                 abfd, elf_metag_howto_table[r_type].name, name);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
                 abfd, elf_metag_howto_table[r_type].name, name);
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
@@ -2312,8 +2302,8 @@ elf_metag_check_relocs (bfd *abfd,
                  && (hh->eh.root.type == bfd_link_hash_defweak
                      || !hh->eh.def_regular)))
            {
                  && (hh->eh.root.type == bfd_link_hash_defweak
                      || !hh->eh.def_regular)))
            {
-             struct elf_metag_dyn_reloc_entry *hdh_p;
-             struct elf_metag_dyn_reloc_entry **hdh_head;
+             struct elf_dyn_relocs *hdh_p;
+             struct elf_dyn_relocs **hdh_head;
 
              if (dynobj == NULL)
                htab->etab.dynobj = dynobj = abfd;
 
              if (dynobj == NULL)
                htab->etab.dynobj = dynobj = abfd;
@@ -2350,26 +2340,26 @@ elf_metag_check_relocs (bfd *abfd,
                    sr = sec;
 
                  vpp = &elf_section_data (sr)->local_dynrel;
                    sr = sec;
 
                  vpp = &elf_section_data (sr)->local_dynrel;
-                 hdh_head = (struct elf_metag_dyn_reloc_entry **) vpp;
+                 hdh_head = (struct elf_dyn_relocs **) vpp;
                }
 
              hdh_p = *hdh_head;
              if (hdh_p == NULL || hdh_p->sec != sec)
                {
                }
 
              hdh_p = *hdh_head;
              if (hdh_p == NULL || hdh_p->sec != sec)
                {
-                 hdh_p = ((struct elf_metag_dyn_reloc_entry *)
+                 hdh_p = ((struct elf_dyn_relocs *)
                           bfd_alloc (dynobj, sizeof *hdh_p));
                  if (hdh_p == NULL)
                    return FALSE;
                           bfd_alloc (dynobj, sizeof *hdh_p));
                  if (hdh_p == NULL)
                    return FALSE;
-                 hdh_p->hdh_next = *hdh_head;
+                 hdh_p->next = *hdh_head;
                  *hdh_head = hdh_p;
                  hdh_p->sec = sec;
                  hdh_p->count = 0;
                  *hdh_head = hdh_p;
                  hdh_p->sec = sec;
                  hdh_p->count = 0;
-                 hdh_p->relative_count = 0;
+                 hdh_p->pc_count = 0;
                }
 
              hdh_p->count += 1;
              if (ELF32_R_TYPE (rel->r_info) == R_METAG_RELBRANCH)
                }
 
              hdh_p->count += 1;
              if (ELF32_R_TYPE (rel->r_info) == R_METAG_RELBRANCH)
-               hdh_p->relative_count += 1;
+               hdh_p->pc_count += 1;
            }
          break;
 
            }
          break;
 
@@ -2384,9 +2374,7 @@ elf_metag_check_relocs (bfd *abfd,
          /* This relocation describes which C++ vtable entries are actually
             used.  Record for later use during GC.  */
        case R_METAG_GNU_VTENTRY:
          /* This relocation describes which C++ vtable entries are actually
             used.  Record for later use during GC.  */
        case R_METAG_GNU_VTENTRY:
-         BFD_ASSERT (hh != NULL);
-         if (hh != NULL
-             && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rel->r_addend))
+         if (!bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rel->r_addend))
            return FALSE;
          break;
        }
            return FALSE;
          break;
        }
@@ -2411,8 +2399,8 @@ elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
     {
       if (hh_dir->dyn_relocs != NULL)
        {
     {
       if (hh_dir->dyn_relocs != NULL)
        {
-         struct elf_metag_dyn_reloc_entry **hdh_pp;
-         struct elf_metag_dyn_reloc_entry *hdh_p;
+         struct elf_dyn_relocs **hdh_pp;
+         struct elf_dyn_relocs *hdh_p;
 
          if (eh_ind->root.type == bfd_link_hash_indirect)
            abort ();
 
          if (eh_ind->root.type == bfd_link_hash_indirect)
            abort ();
@@ -2421,19 +2409,19 @@ elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
             list.  Merge any entries against the same section.  */
          for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
            {
             list.  Merge any entries against the same section.  */
          for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
            {
-             struct elf_metag_dyn_reloc_entry *hdh_q;
+             struct elf_dyn_relocs *hdh_q;
 
              for (hdh_q = hh_dir->dyn_relocs; hdh_q != NULL;
 
              for (hdh_q = hh_dir->dyn_relocs; hdh_q != NULL;
-                  hdh_q = hdh_q->hdh_next)
+                  hdh_q = hdh_q->next)
                if (hdh_q->sec == hdh_p->sec)
                  {
                if (hdh_q->sec == hdh_p->sec)
                  {
-                   hdh_q->relative_count += hdh_p->relative_count;
+                   hdh_q->pc_count += hdh_p->pc_count;
                    hdh_q->count += hdh_p->count;
                    hdh_q->count += hdh_p->count;
-                   *hdh_pp = hdh_p->hdh_next;
+                   *hdh_pp = hdh_p->next;
                    break;
                  }
              if (hdh_q == NULL)
                    break;
                  }
              if (hdh_q == NULL)
-               hdh_pp = &hdh_p->hdh_next;
+               hdh_pp = &hdh_p->next;
            }
          *hdh_pp = hh_dir->dyn_relocs;
        }
            }
          *hdh_pp = hh_dir->dyn_relocs;
        }
@@ -2452,6 +2440,23 @@ elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
   _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
 }
 
   _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
 }
 
+/* Find dynamic relocs for H that apply to read-only sections.  */
+
+static asection *
+readonly_dynrelocs (struct elf_link_hash_entry *h)
+{
+  struct elf_dyn_relocs *p;
+
+  for (p = metag_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
+    {
+      asection *s = p->sec->output_section;
+
+      if (s != NULL && (s->flags & SEC_READONLY) != 0)
+       return p->sec;
+    }
+  return NULL;
+}
+
 /* Adjust a symbol defined by a dynamic object and referenced by a
    regular object.  The current definition is in some section of the
    dynamic object, but we're not including those sections.  We have to
 /* Adjust a symbol defined by a dynamic object and referenced by a
    regular object.  The current definition is in some section of the
    dynamic object, but we're not including those sections.  We have to
@@ -2463,8 +2468,6 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
                                 struct elf_link_hash_entry *eh)
 {
   struct elf_metag_link_hash_table *htab;
                                 struct elf_link_hash_entry *eh)
 {
   struct elf_metag_link_hash_table *htab;
-  struct elf_metag_link_hash_entry *hh;
-  struct elf_metag_dyn_reloc_entry *hdh_p;
   asection *s, *srel;
 
   /* If this is a function, put it in the procedure linkage table.  We
   asection *s, *srel;
 
   /* If this is a function, put it in the procedure linkage table.  We
@@ -2527,17 +2530,9 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
       return TRUE;
     }
 
       return TRUE;
     }
 
-  hh = (struct elf_metag_link_hash_entry *) eh;
-  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
-    {
-      s = hdh_p->sec->output_section;
-      if (s != NULL && (s->flags & SEC_READONLY) != 0)
-       break;
-    }
-
-  /* If we didn't find any dynamic relocs in read-only sections, then
+  /* If we don't find any dynamic relocs in read-only sections, then
      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
-  if (hdh_p == NULL)
+  if (!readonly_dynrelocs (eh))
     {
       eh->non_got_ref = 0;
       return TRUE;
     {
       eh->non_got_ref = 0;
       return TRUE;
@@ -2586,7 +2581,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
   struct bfd_link_info *info;
   struct elf_metag_link_hash_table *htab;
   struct elf_metag_link_hash_entry *hh;
   struct bfd_link_info *info;
   struct elf_metag_link_hash_table *htab;
   struct elf_metag_link_hash_entry *hh;
-  struct elf_metag_dyn_reloc_entry *hdh_p;
+  struct elf_dyn_relocs *hdh_p;
 
   if (eh->root.type == bfd_link_hash_indirect)
     return TRUE;
 
   if (eh->root.type == bfd_link_hash_indirect)
     return TRUE;
@@ -2705,16 +2700,16 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
     {
       if (SYMBOL_CALLS_LOCAL (info, eh))
        {
     {
       if (SYMBOL_CALLS_LOCAL (info, eh))
        {
-         struct elf_metag_dyn_reloc_entry **hdh_pp;
+         struct elf_dyn_relocs **hdh_pp;
 
          for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
            {
 
          for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
            {
-             hdh_p->count -= hdh_p->relative_count;
-             hdh_p->relative_count = 0;
+             hdh_p->count -= hdh_p->pc_count;
+             hdh_p->pc_count = 0;
              if (hdh_p->count == 0)
              if (hdh_p->count == 0)
-               *hdh_pp = hdh_p->hdh_next;
+               *hdh_pp = hdh_p->next;
              else
              else
-               hdh_pp = &hdh_p->hdh_next;
+               hdh_pp = &hdh_p->next;
            }
        }
 
            }
        }
 
@@ -2770,7 +2765,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
     }
 
   /* Finally, allocate space.  */
     }
 
   /* Finally, allocate space.  */
-  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
+  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
     {
       asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
       sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
     {
       asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
       sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
@@ -2779,31 +2774,29 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
   return TRUE;
 }
 
   return TRUE;
 }
 
-/* Find any dynamic relocs that apply to read-only sections.  */
+/* Set DF_TEXTREL if we find any dynamic relocs that apply to
+   read-only sections.  */
 
 static bfd_boolean
 
 static bfd_boolean
-readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
+maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
 {
 {
-  struct elf_metag_link_hash_entry *hh;
-  struct elf_metag_dyn_reloc_entry *hdh_p;
+  asection *sec;
 
 
-  if (eh->root.type == bfd_link_hash_warning)
-    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
+  if (h->root.type == bfd_link_hash_indirect)
+    return TRUE;
 
 
-  hh = (struct elf_metag_link_hash_entry *) eh;
-  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
+  sec = readonly_dynrelocs (h);
+  if (sec != NULL)
     {
     {
-      asection *s = hdh_p->sec->output_section;
-
-      if (s != NULL && (s->flags & SEC_READONLY) != 0)
-       {
-         struct bfd_link_info *info = inf;
+      struct bfd_link_info *info = (struct bfd_link_info *) info_p;
 
 
-         info->flags |= DF_TEXTREL;
+      info->flags |= DF_TEXTREL;
+      info->callbacks->minfo
+       (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
+        sec->owner, h->root.root.string, sec);
 
 
-         /* Not an error, just cut short the traversal.  */
-         return FALSE;
-       }
+      /* Not an error, just cut short the traversal.  */
+      return FALSE;
     }
   return TRUE;
 }
     }
   return TRUE;
 }
@@ -2854,12 +2847,12 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       for (s = ibfd->sections; s != NULL; s = s->next)
        {
 
       for (s = ibfd->sections; s != NULL; s = s->next)
        {
-         struct elf_metag_dyn_reloc_entry *hdh_p;
+         struct elf_dyn_relocs *hdh_p;
 
 
-         for (hdh_p = ((struct elf_metag_dyn_reloc_entry *)
+         for (hdh_p = ((struct elf_dyn_relocs *)
                        elf_section_data (s)->local_dynrel);
               hdh_p != NULL;
                        elf_section_data (s)->local_dynrel);
               hdh_p != NULL;
-              hdh_p = hdh_p->hdh_next)
+              hdh_p = hdh_p->next)
            {
              if (!bfd_is_abs_section (hdh_p->sec)
                  && bfd_is_abs_section (hdh_p->sec->output_section))
            {
              if (!bfd_is_abs_section (hdh_p->sec)
                  && bfd_is_abs_section (hdh_p->sec->output_section))
@@ -2941,7 +2934,7 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
          /* Strip this section if we don't need it; see the
             comment below.  */
        }
          /* Strip this section if we don't need it; see the
             comment below.  */
        }
-      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
+      else if (CONST_STRNEQ (bfd_section_name (s), ".rela"))
        {
          if (s->size != 0 && s != htab->etab.srelplt)
            relocs = TRUE;
        {
          if (s->size != 0 && s != htab->etab.srelplt)
            relocs = TRUE;
@@ -3032,7 +3025,7 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
          /* If any dynamic relocs apply to a read-only section,
             then we need a DT_TEXTREL entry.  */
          if ((info->flags & DF_TEXTREL) == 0)
          /* If any dynamic relocs apply to a read-only section,
             then we need a DT_TEXTREL entry.  */
          if ((info->flags & DF_TEXTREL) == 0)
-           elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
+           elf_link_hash_traverse (&htab->etab, maybe_set_textrel, info);
 
          if ((info->flags & DF_TEXTREL) != 0)
            {
 
          if ((info->flags & DF_TEXTREL) != 0)
            {
@@ -3244,14 +3237,17 @@ elf_metag_finish_dynamic_symbol (bfd *output_bfd,
 
 /* Set the Meta ELF ABI version.  */
 
 
 /* Set the Meta ELF ABI version.  */
 
-static void
-elf_metag_post_process_headers (bfd * abfd, struct bfd_link_info * link_info)
+static bfd_boolean
+elf_metag_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
 {
   Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
 
 {
   Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
 
-  _bfd_elf_post_process_headers (abfd, link_info);
+  if (!_bfd_elf_init_file_header (abfd, link_info))
+    return FALSE;
+
   i_ehdrp = elf_elfheader (abfd);
   i_ehdrp->e_ident[EI_ABIVERSION] = METAG_ELF_ABI_VERSION;
   i_ehdrp = elf_elfheader (abfd);
   i_ehdrp->e_ident[EI_ABIVERSION] = METAG_ELF_ABI_VERSION;
+  return TRUE;
 }
 
 /* Used to decide how to sort relocs in an optimal manner for the
 }
 
 /* Used to decide how to sort relocs in an optimal manner for the
@@ -3463,7 +3459,7 @@ metag_type_of_stub (asection *input_sec,
 #define MOV_PC_A0_3    0xa3180ca0
 
 static bfd_boolean
 #define MOV_PC_A0_3    0xa3180ca0
 
 static bfd_boolean
-metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
+metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
 {
   struct elf_metag_stub_hash_entry *hsh;
   asection *stub_sec;
 {
   struct elf_metag_stub_hash_entry *hsh;
   asection *stub_sec;
@@ -3471,9 +3467,19 @@ metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_U
   bfd_byte *loc;
   bfd_vma sym_value;
   int size;
   bfd_byte *loc;
   bfd_vma sym_value;
   int size;
+  struct bfd_link_info *info;
 
   /* Massage our args to the form they really have.  */
   hsh = (struct elf_metag_stub_hash_entry *) gen_entry;
 
   /* Massage our args to the form they really have.  */
   hsh = (struct elf_metag_stub_hash_entry *) gen_entry;
+  info = (struct bfd_link_info *) in_arg;
+
+  /* Fail if the target section could not be assigned to an output
+     section.  The user should fix his linker script.  */
+  if (hsh->target_section->output_section == NULL
+      && info->non_contiguous_regions)
+    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+                             "Retry without --enable-non-contiguous-regions.\n"),
+                           hsh->target_section);
 
   stub_sec = hsh->stub_sec;
 
 
   stub_sec = hsh->stub_sec;
 
@@ -3566,7 +3572,7 @@ elf_metag_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
   unsigned int top_id, top_index;
   asection *section;
   asection **input_list, **list;
   unsigned int top_id, top_index;
   asection *section;
   asection **input_list, **list;
-  bfd_size_type amt;
+  size_t amt;
   struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
 
   /* Count the number of input BFDs and find the top input section id.  */
   struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
 
   /* Count the number of input BFDs and find the top input section id.  */
@@ -3745,7 +3751,7 @@ get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
   /* We want to read in symbol extension records only once.  To do this
      we need to read in the local symbols in parallel and save them for
      later use; so hold pointers to the local symbols in an array.  */
   /* We want to read in symbol extension records only once.  To do this
      we need to read in the local symbols in parallel and save them for
      later use; so hold pointers to the local symbols in an array.  */
-  bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
+  size_t amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
   all_local_syms = bfd_zmalloc (amt);
   htab->all_local_syms = all_local_syms;
   if (all_local_syms == NULL)
   all_local_syms = bfd_zmalloc (amt);
   htab->all_local_syms = all_local_syms;
   if (all_local_syms == NULL)
@@ -4151,8 +4157,8 @@ elf_metag_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_finish_dynamic_sections    elf_metag_finish_dynamic_sections
 #define elf_backend_size_dynamic_sections      elf_metag_size_dynamic_sections
 #define elf_backend_omit_section_dynsym \
 #define elf_backend_finish_dynamic_sections    elf_metag_finish_dynamic_sections
 #define elf_backend_size_dynamic_sections      elf_metag_size_dynamic_sections
 #define elf_backend_omit_section_dynsym \
-  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
-#define elf_backend_post_process_headers       elf_metag_post_process_headers
+       _bfd_elf_omit_section_dynsym_all
+#define elf_backend_init_file_header           elf_metag_init_file_header
 #define elf_backend_reloc_type_class           elf_metag_reloc_type_class
 #define elf_backend_copy_indirect_symbol       elf_metag_copy_indirect_symbol
 #define elf_backend_plt_sym_val                elf_metag_plt_sym_val
 #define elf_backend_reloc_type_class           elf_metag_reloc_type_class
 #define elf_backend_copy_indirect_symbol       elf_metag_copy_indirect_symbol
 #define elf_backend_plt_sym_val                elf_metag_plt_sym_val
This page took 0.038273 seconds and 4 git commands to generate.