aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-ppc.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2002-11-12 07:55:43 +0000
committerAlan Modra <amodra@gmail.com>2002-11-12 07:55:43 +0000
commitd6fe2dc1025ff668354949649d24933115b1b570 (patch)
tree15bcc6c9977cd5e2e0caf0382c7230429dbe194e /bfd/elf64-ppc.c
parent126495ed15554a735f74a9414c2e417f9b2de4c2 (diff)
downloadgdb-d6fe2dc1025ff668354949649d24933115b1b570.zip
gdb-d6fe2dc1025ff668354949649d24933115b1b570.tar.gz
gdb-d6fe2dc1025ff668354949649d24933115b1b570.tar.bz2
* elflink.h (elf_link_add_object_symbols): Optimize stabs for
relocatable link too. (elf_link_input_bfd): When emitting relocs, adjust offsets for eh_frame and stab sections. Zap deleted relocs. (elf_reloc_symbol_deleted_p): Return true for zero r_symndx. (elf_bfd_discard_info): Run for relocatable link too. * elf64-ppc.c (ppc64_elf_edit_opd): Rename from edit_opd. Make global. Handle ld -r case. (ppc64_elf_size_dynamic_sections): Don't call edit_opd from here. * elf64-ppc.h (ppc64_elf_edit_opd): Declare.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r--bfd/elf64-ppc.c69
1 files changed, 51 insertions, 18 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index e92c997..384348e 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -1972,8 +1972,6 @@ static boolean ppc64_elf_adjust_dynamic_symbol
PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
static void ppc64_elf_hide_symbol
PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, boolean));
-static boolean edit_opd
- PARAMS ((bfd *, struct bfd_link_info *));
static boolean allocate_dynrelocs
PARAMS ((struct elf_link_hash_entry *, PTR));
static boolean readonly_dynrelocs
@@ -3539,8 +3537,8 @@ ppc64_elf_hide_symbol (info, h, force_local)
}
}
-static boolean
-edit_opd (obfd, info)
+boolean
+ppc64_elf_edit_opd (obfd, info)
bfd *obfd;
struct bfd_link_info *info;
{
@@ -3557,6 +3555,7 @@ edit_opd (obfd, info)
Elf_Internal_Sym *local_syms;
struct elf_link_hash_entry **sym_hashes;
bfd_vma offset;
+ bfd_size_type amt;
long *adjust;
boolean need_edit;
@@ -3564,9 +3563,16 @@ edit_opd (obfd, info)
if (sec == NULL)
continue;
+ amt = sec->_raw_size * sizeof (long) / 24;
adjust = (long *) elf_section_data (sec)->tdata;
- BFD_ASSERT (adjust != NULL);
- memset (adjust, 0, (size_t) sec->_raw_size * sizeof (long) / 24);
+ if (adjust == NULL)
+ {
+ /* Must be a ld -r link. ie. check_relocs hasn't been
+ called. */
+ adjust = (long *) bfd_zalloc (obfd, amt);
+ elf_section_data (sec)->tdata = adjust;
+ }
+ memset (adjust, 0, (size_t) amt);
if (sec->output_section == bfd_abs_section_ptr)
continue;
@@ -3769,14 +3775,29 @@ edit_opd (obfd, info)
{
/* Arrange for the function descriptor sym
to be dropped. */
- struct elf_link_hash_entry *fdh;
+ struct ppc_link_hash_entry *fdh;
struct ppc_link_hash_entry *fh;
fh = (struct ppc_link_hash_entry *) h;
- BFD_ASSERT (fh->is_func);
- fdh = fh->oh;
- fdh->root.u.def.value = 0;
- fdh->root.u.def.section = sym_sec;
+ fdh = (struct ppc_link_hash_entry *) fh->oh;
+ if (fdh == NULL)
+ {
+ const char *fd_name;
+ struct ppc_link_hash_table *htab;
+
+ fd_name = h->root.root.string + 1;
+ htab = ppc_hash_table (info);
+ fdh = (struct ppc_link_hash_entry *)
+ elf_link_hash_lookup (&htab->elf, fd_name,
+ false, false, false);
+ fdh->is_func_descriptor = 1;
+ fdh->oh = &fh->elf;
+ fh->is_func = 1;
+ fh->oh = &fdh->elf;
+ }
+
+ fdh->elf.root.u.def.value = 0;
+ fdh->elf.root.u.def.section = sym_sec;
}
}
else
@@ -3789,13 +3810,28 @@ edit_opd (obfd, info)
to this location in the opd section.
We've checked above that opd relocs are
ordered. */
- struct elf_link_hash_entry *fdh;
+ struct ppc_link_hash_entry *fdh;
struct ppc_link_hash_entry *fh;
fh = (struct ppc_link_hash_entry *) h;
- BFD_ASSERT (fh->is_func);
- fdh = fh->oh;
- fdh->root.u.def.value = wptr - sec->contents;
+ fdh = (struct ppc_link_hash_entry *) fh->oh;
+ if (fdh == NULL)
+ {
+ const char *fd_name;
+ struct ppc_link_hash_table *htab;
+
+ fd_name = h->root.root.string + 1;
+ htab = ppc_hash_table (info);
+ fdh = (struct ppc_link_hash_entry *)
+ elf_link_hash_lookup (&htab->elf, fd_name,
+ false, false, false);
+ fdh->is_func_descriptor = 1;
+ fdh->oh = &fh->elf;
+ fh->is_func = 1;
+ fh->oh = &fdh->elf;
+ }
+
+ fdh->elf.root.u.def.value = wptr - sec->contents;
}
else
{
@@ -4145,9 +4181,6 @@ ppc64_elf_size_dynamic_sections (output_bfd, info)
}
}
- if (!edit_opd (output_bfd, info))
- return false;
-
/* Allocate global sym .plt and .got entries, and space for global
sym dynamic relocs. */
elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);