Alpha DT_RELA
authorAlan Modra <amodra@gmail.com>
Mon, 20 Feb 2017 07:27:43 +0000 (17:57 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 21 Feb 2017 01:19:37 +0000 (11:49 +1030)
* elf64-alpha.c (elf64_alpha_size_dynamic_sections): Only emit
DT_RELA, DT_RELASZ, and DT_RELAENT when DT_RELASZ is non-zero.

bfd/ChangeLog
bfd/elf64-alpha.c

index 3e90624..ac3f160 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-21  Alan Modra  <amodra@gmail.com>
+
+       * elf64-alpha.c (elf64_alpha_size_dynamic_sections): Only emit
+       DT_RELA, DT_RELASZ, and DT_RELAENT when DT_RELASZ is non-zero.
+
 2017-02-20  Alan Modra  <amodra@gmail.com>
 
        PR 21181
index b4a50f4..43c6ed8 100644 (file)
@@ -2879,7 +2879,7 @@ elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 {
   bfd *dynobj;
   asection *s;
-  bfd_boolean relplt;
+  bfd_boolean relplt, relocs;
   struct alpha_elf_link_hash_table * htab;
 
   htab = alpha_elf_hash_table (info);
@@ -2916,6 +2916,7 @@ elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
      determined the sizes of the various dynamic sections.  Allocate
      memory for them.  */
   relplt = FALSE;
+  relocs = FALSE;
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
       const char *name;
@@ -2933,6 +2934,8 @@ elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
            {
              if (strcmp (name, ".rela.plt") == 0)
                relplt = TRUE;
+             else
+               relocs = TRUE;
 
              /* We use the reloc_count field as a counter if we need
                 to copy relocs into the output file.  */
@@ -2997,15 +3000,18 @@ elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
            return FALSE;
        }
 
-      if (!add_dynamic_entry (DT_RELA, 0)
-         || !add_dynamic_entry (DT_RELASZ, 0)
-         || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
-       return FALSE;
-
-      if (info->flags & DF_TEXTREL)
+      if (relocs)
        {
-         if (!add_dynamic_entry (DT_TEXTREL, 0))
+         if (!add_dynamic_entry (DT_RELA, 0)
+             || !add_dynamic_entry (DT_RELASZ, 0)
+             || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
            return FALSE;
+
+         if (info->flags & DF_TEXTREL)
+           {
+             if (!add_dynamic_entry (DT_TEXTREL, 0))
+               return FALSE;
+           }
        }
     }
 #undef add_dynamic_entry