Wrong function reported for linker error message

OPD lookup goes awry when .opd has been shuffled to remove unused
functions.

	* elf64-ppc.c (ppc64_elf_maybe_function_sym): Adjust symbol value
	if .opd section has been edited.
This commit is contained in:
Alan Modra 2015-09-01 17:28:13 +09:30
parent a4b6fadd50
commit b07bca4ecd
2 changed files with 22 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2015-09-01 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ppc64_elf_maybe_function_sym): Adjust symbol value
if .opd section has been edited.
2015-09-01 Alan Modra <amodra@gmail.com>
PR 18878

View File

@ -6130,7 +6130,23 @@ ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
if (strcmp (sym->section->name, ".opd") == 0)
{
if (opd_entry_value (sym->section, sym->value,
struct _opd_sec_data *opd = get_opd_info (sym->section);
bfd_vma symval = sym->value;
if (opd != NULL
&& opd->adjust != NULL
&& elf_section_data (sym->section)->relocs != NULL)
{
/* opd_entry_value will use cached relocs that have been
adjusted, but with raw symbols. That means both local
and global symbols need adjusting. */
long adjust = opd->adjust[OPD_NDX (symval)];
if (adjust == -1)
return 0;
symval += adjust;
}
if (opd_entry_value (sym->section, symval,
&sec, code_off, TRUE) == (bfd_vma) -1)
return 0;
/* An old ABI binary with dot-syms has a size of 24 on the .opd