aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2014-06-24 13:23:04 +0930
committerAlan Modra <amodra@gmail.com>2014-06-24 13:39:04 +0930
commit15bfcc77681f423fd872815eb140c450d69b8a60 (patch)
treeca0001f421df891e6589dfb88a34fc10930f3936
parent3343ef86879b9348bb038bc7adecb665236ca4d8 (diff)
downloadgdb-15bfcc77681f423fd872815eb140c450d69b8a60.zip
gdb-15bfcc77681f423fd872815eb140c450d69b8a60.tar.gz
gdb-15bfcc77681f423fd872815eb140c450d69b8a60.tar.bz2
Don't strip section defining _SDA_BASE_
Prior to 93d1b056 _SDA_BASE_ used to be defined in a linker script output section. Now _SDA_BASE_ is defined in an input section that is subject to being stripped. If the section is stripped we don't output the symbol, which results in --emit-relocs trying to emit relocs with dangling references to _SDA_BASE_. * elf32-ppc.c (ppc_elf_size_dynamic_sections): Arrange to keep .sdata/.sdata2 when _SDA_BASE_/_SDA2_BASE_ should be output for --emit-relocs.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-ppc.c19
2 files changed, 22 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index fcf2cd3..9cd00df 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2014-06-24 Alan Modra <amodra@gmail.com>
+
+ * elf32-ppc.c (ppc_elf_size_dynamic_sections): Arrange to keep
+ .sdata/.sdata2 when _SDA_BASE_/_SDA2_BASE_ should be output
+ for --emit-relocs.
+
2014-06-21 Philippe De Muyter <phdm@macqel.be>
* targets.c (_bfd_target_vector): Add missing #ifdef BFD64 for
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index bc793d7..c4a9543 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -6304,6 +6304,16 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd,
sda->root.u.def.section = htab->elf.hgot->root.u.def.section;
sda->root.u.def.value = htab->elf.hgot->root.u.def.value;
}
+ if (info->emitrelocations)
+ {
+ struct elf_link_hash_entry *sda = htab->sdata[0].sym;
+
+ if (sda != NULL && sda->ref_regular)
+ sda->root.u.def.section->flags |= SEC_KEEP;
+ sda = htab->sdata[1].sym;
+ if (sda != NULL && sda->ref_regular)
+ sda->root.u.def.section->flags |= SEC_KEEP;
+ }
if (htab->glink != NULL
&& htab->glink->size != 0
@@ -6396,12 +6406,15 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd,
|| s == htab->sgotplt
|| s == htab->sbss
|| s == htab->dynbss
- || s == htab->dynsbss
- || s == htab->sdata[0].section
- || s == htab->sdata[1].section)
+ || s == htab->dynsbss)
{
/* Strip these too. */
}
+ else if (s == htab->sdata[0].section
+ || s == htab->sdata[1].section)
+ {
+ strip_section = (s->flags & SEC_KEEP) == 0;
+ }
else if (CONST_STRNEQ (bfd_get_section_name (htab->elf.dynobj, s),
".rela"))
{