aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2004-08-17 01:25:21 +0000
committerAlan Modra <amodra@gmail.com>2004-08-17 01:25:21 +0000
commit816881401eed1e79939dbbbd16ad5ffb5f6332e7 (patch)
treea7a69681b009a2f96dc9f4fd19494bb6d40f6031 /bfd
parent2f4a83ee593c83ec1205f2e9643aca1e4d976c0b (diff)
downloadgdb-816881401eed1e79939dbbbd16ad5ffb5f6332e7.zip
gdb-816881401eed1e79939dbbbd16ad5ffb5f6332e7.tar.gz
gdb-816881401eed1e79939dbbbd16ad5ffb5f6332e7.tar.bz2
* elf64-ppc.c (struct ppc64_elf_obj_tdata): Add "deleted_section".
(adjust_opd_syms): Attach opd syms for deleted entries to one of the sections that will be discarded.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf64-ppc.c16
2 files changed, 21 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4bfcd1e..8cb7a66 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2004-08-17 Alan Modra <amodra@bigpond.net.au>
+
+ * elf64-ppc.c (struct ppc64_elf_obj_tdata): Add "deleted_section".
+ (adjust_opd_syms): Attach opd syms for deleted entries to one of
+ the sections that will be discarded.
+
2004-08-16 Alan Modra <amodra@bigpond.net.au>
* elflink.c (elf_section_complain_discarded): Ignore .fixup.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index fca84ac..ccb8089 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -2333,6 +2333,10 @@ struct ppc64_elf_obj_tdata
asection *got;
asection *relgot;
+ /* Used during garbage collection. We attach global symbols defined
+ on removed .opd entries to this section so that the sym is removed. */
+ asection *deleted_section;
+
/* TLS local dynamic got entry handling. Suppose for multiple GOT
sections means we potentially need one of these for each input bfd. */
union {
@@ -5227,8 +5231,18 @@ adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
if (adjust == -1)
{
/* This entry has been deleted. */
+ asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
+ if (dsec == NULL)
+ {
+ for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
+ if (elf_discarded_section (dsec))
+ {
+ ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
+ break;
+ }
+ }
eh->elf.root.u.def.value = 0;
- eh->elf.root.u.def.section = &bfd_abs_section;
+ eh->elf.root.u.def.section = dsec;
}
else
eh->elf.root.u.def.value += adjust;