diff options
author | Alan Modra <amodra@gmail.com> | 2002-11-12 07:55:43 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2002-11-12 07:55:43 +0000 |
commit | d6fe2dc1025ff668354949649d24933115b1b570 (patch) | |
tree | 15bcc6c9977cd5e2e0caf0382c7230429dbe194e /bfd/elf64-ppc.c | |
parent | 126495ed15554a735f74a9414c2e417f9b2de4c2 (diff) | |
download | gdb-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.c | 69 |
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); |