This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Wrong function reported for linker error message


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b07bca4ecd27f9cbaff822e4135abaf0ae6cd0db

commit b07bca4ecd27f9cbaff822e4135abaf0ae6cd0db
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Sep 1 17:28:13 2015 +0930

    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.

Diff:
---
 bfd/ChangeLog   |  5 +++++
 bfd/elf64-ppc.c | 18 +++++++++++++++++-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e2819fe..b3ee41b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,10 @@
 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
 	* elf64-ppc.c (ARRAY_SIZE): Define.  Use throughout.
 	(enum ppc_stub_type): Add ppc_stub_save_res.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 15d5238..f179f6d 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]