PowerPC64 notoc calls

Alan Modra amodra@gmail.com
Wed Jun 19 04:36:00 GMT 2019


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 --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 9372ea4694..61620190ce 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;

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list