This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
powerpc64 tail calls
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sources dot redhat dot com
- Cc: hugh dot daschbach at emulex dot com
- Date: Tue, 13 Dec 2005 16:08:48 +1030
- Subject: powerpc64 tail calls
See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25380. Attempting to
compile powerpc64-linux shared libs without -fpic can lead to trouble
with tail calls. This forces the linker to resolve them locally.
Which breaks ELF shared lib symbol resolution rules, but I can't warn
here because self-recursion via a tail call is fine.
* elf64-ppc.c (ppc64_elf_relocate_section): Force tail calls in
shared libs to resolve locally.
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.227
diff -u -p -r1.227 elf64-ppc.c
--- bfd/elf64-ppc.c 12 Dec 2005 03:59:52 -0000 1.227
+++ bfd/elf64-ppc.c 13 Dec 2005 05:32:54 -0000
@@ -10070,10 +10070,12 @@ ppc64_elf_relocate_section (bfd *output_
if (stub_entry->stub_type == ppc_stub_plt_call)
{
/* If this is a plain branch rather than a branch
- and link, don't require a nop. */
+ and link, don't require a nop. However, don't
+ allow tail calls in a shared library as they
+ will result in r2 being corrupted. */
unsigned long br;
br = bfd_get_32 (input_bfd, contents + rel->r_offset);
- if ((br & 1) == 0)
+ if (info->executable && (br & 1) == 0)
can_plt_call = TRUE;
else
stub_entry = NULL;
--
Alan Modra
IBM OzLabs - Linux Technology Centre