[binutils-gdb] PowerPC64 notoc calls

Alan Modra amodra@sourceware.org
Wed Jun 19 04:38:00 GMT 2019


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

commit 4a4e7361d67cd9262be1413300795eede564f4cb
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Jun 18 10:34:14 2019 +0930

    PowerPC64 notoc calls
    
    Calls from functions that don't have a valid toc pointer in r2 (these
    calls are marked with _NOTOC relocs) to functions that require r2
    valid must go via the callee global entry point.  This patch corrects
    the condition the linker was using to detect functions that require r2
    to be valid.  Values of both zero and one in st_other local entry bits
    mean a function doesn't care about r2.
    
    	* elf64-ppc.c (ppc64_elf_inline_plt): Correct st_other test for
    	functions that require r2 valid to use local entry.
    	(ppc64_elf_size_stubs, ppc64_elf_relocate_section): Likewise.

Diff:
---
 bfd/ChangeLog   | 6 ++++++
 bfd/elf64-ppc.c | 6 +++---
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e1767fe..ea049b1 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2019-06-19  Alan Modra  <amodra@gmail.com>
+
+	* elf64-ppc.c (ppc64_elf_inline_plt): Correct st_other test for
+	functions that require r2 valid to use local entry.
+	(ppc64_elf_size_stubs, ppc64_elf_relocate_section): Likewise.
+
 2019-06-17  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
 	* elfnn-aarch64.c (elfNN_aarch64_allocate_local_dynrelocs): Remove.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 9372ea4..6162019 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -7445,7 +7445,7 @@ ppc64_elf_inline_plt (struct bfd_link_info *info)
 			&& !(r_type == R_PPC64_PLTCALL_NOTOC
 			     && (((h ? h->other : sym->st_other)
 				  & STO_PPC64_LOCAL_MASK)
-				 != 1 << STO_PPC64_LOCAL_BIT)))
+				 > 1 << STO_PPC64_LOCAL_BIT)))
 		      *tls_maskp &= ~PLT_KEEP;
 		  }
 	      }
@@ -12897,7 +12897,7 @@ ppc64_elf_size_stubs (struct bfd_link_info *info)
 				   && code_sec->output_section != NULL
 				   && (((hash ? hash->elf.other : sym->st_other)
 					& STO_PPC64_LOCAL_MASK)
-				       != 1 << STO_PPC64_LOCAL_BIT)))
+				       > 1 << STO_PPC64_LOCAL_BIT)))
 			stub_type = ppc_stub_long_branch_notoc;
 		    }
 		  else if (stub_type != ppc_stub_plt_call)
@@ -15056,7 +15056,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
 		  || stub_entry->stub_type == ppc_stub_plt_branch_both)
 	      && (r_type != R_PPC64_REL24_NOTOC
 		  || ((fdh ? fdh->elf.other : sym->st_other)
-		      & STO_PPC64_LOCAL_MASK) == 1 << STO_PPC64_LOCAL_BIT)
+		      & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT)
 	      && (relocation + addend - from + max_br_offset
 		  < 2 * max_br_offset))
 	    stub_entry = NULL;



More information about the Binutils-cvs mailing list