From 4a4e7361d67cd9262be1413300795eede564f4cb Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 18 Jun 2019 10:34:14 +0930 Subject: [PATCH] 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. --- bfd/ChangeLog | 6 ++++++ bfd/elf64-ppc.c | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e1767fe7949..ea049b1d423 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2019-06-19 Alan Modra + + * 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 * elfnn-aarch64.c (elfNN_aarch64_allocate_local_dynrelocs): Remove. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 9372ea46943..61620190ce6 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; -- 2.30.2