summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2017-02-20 17:57:43 +1030
committerAlan Modra <amodra@gmail.com>2017-02-21 11:49:37 +1030
commit24f1a75169e554d418be009d803a02e441584ea7 (patch)
treee064932f37d7ce5c02b2336698ae638a846b29b8
parent262062fffd192fe76a6c59741bbbb1c5ae0bae53 (diff)
downloadbinutils-gdb-24f1a75169e554d418be009d803a02e441584ea7.tar.gz
Alpha DT_RELA
* elf64-alpha.c (elf64_alpha_size_dynamic_sections): Only emit DT_RELA, DT_RELASZ, and DT_RELAENT when DT_RELASZ is non-zero.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-alpha.c22
2 files changed, 19 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3e90624353e..ac3f160b078 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c
index b4a50f4e777..43c6ed8d3d0 100644
--- a/bfd/elf64-alpha.c
+++ b/bfd/elf64-alpha.c
@@ -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