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:
parent
a4b6fadd50
commit
b07bca4ecd
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user