* elf64-ppc.c (ppc64_elf_edit_toc): Always adjust local syms in

.toc section, even when none are used in relocs.
This commit is contained in:
Alan Modra 2010-07-29 07:35:58 +00:00
parent 67aceb73d6
commit d62b368413
2 changed files with 31 additions and 30 deletions

View File

@ -1,3 +1,8 @@
2010-07-29 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ppc64_elf_edit_toc): Always adjust local syms in
.toc section, even when none are used in relocs.
2010-07-27 Maciej W. Rozycki <macro@codesourcery.com> 2010-07-27 Maciej W. Rozycki <macro@codesourcery.com>
* elfxx-mips.h: Include "elf/mips.h". * elfxx-mips.h: Include "elf/mips.h".

View File

@ -8248,6 +8248,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
{ {
bfd_byte *contents, *src; bfd_byte *contents, *src;
unsigned long off; unsigned long off;
Elf_Internal_Sym *sym;
bfd_boolean local_toc_syms = FALSE; bfd_boolean local_toc_syms = FALSE;
/* Shuffle the toc contents, and at the same time convert the /* Shuffle the toc contents, and at the same time convert the
@ -8292,7 +8293,6 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
unsigned long r_symndx; unsigned long r_symndx;
asection *sym_sec; asection *sym_sec;
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
Elf_Internal_Sym *sym;
bfd_vma val; bfd_vma val;
r_type = ELF64_R_TYPE (rel->r_info); r_type = ELF64_R_TYPE (rel->r_info);
@ -8371,38 +8371,34 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
/* We shouldn't have local or global symbols defined in the TOC, /* We shouldn't have local or global symbols defined in the TOC,
but handle them anyway. */ but handle them anyway. */
if (local_toc_syms) for (sym = local_syms;
{ sym < local_syms + symtab_hdr->sh_info;
Elf_Internal_Sym *sym; ++sym)
if (sym->st_value != 0
&& bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
{
unsigned long i;
for (sym = local_syms; if (sym->st_value > toc->rawsize)
sym < local_syms + symtab_hdr->sh_info; i = toc->rawsize >> 3;
++sym) else
if (sym->st_value != 0 i = sym->st_value >> 3;
&& bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
{ {
unsigned long i; if (local_toc_syms)
(*_bfd_error_handler)
if (sym->st_value > toc->rawsize) (_("%s defined on removed toc entry"),
i = toc->rawsize >> 3; bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
else do
i = sym->st_value >> 3; ++i;
while ((skip[i] & (ref_from_discarded | can_optimize)));
if ((skip[i] & (ref_from_discarded | can_optimize)) != 0) sym->st_value = (bfd_vma) i << 3;
{
(*_bfd_error_handler)
(_("%s defined on removed toc entry"),
bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
do
++i;
while ((skip[i] & (ref_from_discarded | can_optimize)));
sym->st_value = (bfd_vma) i << 3;
}
sym->st_value -= skip[i];
symtab_hdr->contents = (unsigned char *) local_syms;
} }
}
sym->st_value -= skip[i];
symtab_hdr->contents = (unsigned char *) local_syms;
}
/* Adjust any global syms defined in this toc input section. */ /* Adjust any global syms defined in this toc input section. */
if (toc_inf.global_toc_syms) if (toc_inf.global_toc_syms)