From: Alan Modra Date: Sun, 14 Aug 2011 09:17:17 +0000 (+0000) Subject: * elf32-ppc.c (ppc_elf_select_plt_layout): Force bss-plt when X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b3874e1a22c1c3732791df6267c000924328592a;p=binutils-gdb.git * elf32-ppc.c (ppc_elf_select_plt_layout): Force bss-plt when shared and call to _mcount will go via plt. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0b31af428b9..d3ec8300434 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2011-08-14 Alan Modra + + * elf32-ppc.c (ppc_elf_select_plt_layout): Force bss-plt when + shared and call to _mcount will go via plt. + 2011-08-14 Alan Modra * elf64-ppc.c: Prefix all einfo error strings with "%P: ". diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 7de93f619de..cfb473479f9 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -4256,8 +4256,27 @@ ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->plt_type == PLT_UNSET) { + struct elf_link_hash_entry *h; + if (plt_style == PLT_OLD) htab->plt_type = PLT_OLD; + else if (info->shared + && htab->elf.dynamic_sections_created + && (h = elf_link_hash_lookup (&htab->elf, "_mcount", + FALSE, FALSE, TRUE)) != NULL + && (h->type == STT_FUNC + || h->needs_plt) + && h->ref_regular + && !(SYMBOL_CALLS_LOCAL (info, h) + || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + && h->root.type == bfd_link_hash_undefweak))) + { + /* Profiling of shared libs (and pies) is not supported with + secure plt, because ppc32 does profiling before a + function prologue and a secure plt pic call stubs needs + r30 to be set up. */ + htab->plt_type = PLT_OLD; + } else { bfd *ibfd; @@ -4285,7 +4304,13 @@ ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED, } } if (htab->plt_type == PLT_OLD && plt_style == PLT_NEW) - info->callbacks->einfo (_("%P: bss-plt forced due to %B\n"), htab->old_bfd); + { + if (htab->old_bfd != NULL) + info->callbacks->einfo (_("%P: bss-plt forced due to %B\n"), + htab->old_bfd); + else + info->callbacks->einfo (_("%P: bss-plt forced by profiling\n")); + } BFD_ASSERT (htab->plt_type != PLT_VXWORKS);