From 0e87343e204b44468ffad0ec5dc8c8d6068f1227 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Fri, 23 Jan 2015 11:16:49 -0500 Subject: [PATCH] powerpc: Fix ifuncmain6pie failure with GCC 4.9 This patch fix the elf/ifuncmain6pie failure when building with GCC 4.9+. For some reason, the compiler removes the branch taken code at resolve_ifunc (sysdeps/powerpc/powerpc64/dl-machine.h) as dead-code and thus the testcase fails because the ifunc resolves branches to an invalid memory location. It fixes by explicit adding a dependency of value based on odp variable to avoid compiler optimization. It fixes BZ#17868. --- ChangeLog | 6 ++++++ NEWS | 2 +- sysdeps/powerpc/powerpc64/dl-machine.h | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index d746e18..cd09380 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-01-24 Adhemerval Zanellla + + [BZ #17868] + * sysdeps/powerpc/powerpc64/dl-machine.h (resolve_ifunc): Force value + set dependency from opd value. + 2015-01-23 H.J. Lu * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): diff --git a/NEWS b/NEWS index 0ce4352..f9ea7cf 100644 --- a/NEWS +++ b/NEWS @@ -18,7 +18,7 @@ Version 2.21 17664, 17665, 17668, 17682, 17702, 17717, 17719, 17722, 17723, 17724, 17725, 17732, 17733, 17744, 17745, 17746, 17747, 17748, 17775, 17777, 17780, 17781, 17782, 17791, 17793, 17796, 17797, 17803, 17806, 17834, - 17844, 17848, 17870 + 17844, 17848, 17868, 17870 * A new semaphore algorithm has been implemented in generic C code for all machines. Previous custom assembly implementations of semaphore were diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 9448712..47bb5a7 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -623,7 +623,9 @@ resolve_ifunc (Elf64_Addr value, opd.fd_func = func->fd_func + sym_map->l_addr; opd.fd_toc = func->fd_toc + sym_map->l_addr; opd.fd_aux = func->fd_aux; - value = (Elf64_Addr) &opd; + /* GCC 4.9+ eliminates the branch as dead code, force the odp set + dependency. */ + asm ("" : "=r" (value) : "0" (&opd), "X" (opd)); } #endif #endif -- 2.7.4