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.
This commit is contained in:
Adhemerval Zanella 2015-01-23 11:16:49 -05:00
parent 972af9e8dd
commit 0e87343e20
3 changed files with 10 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2015-01-24 Adhemerval Zanellla <azanella@linux.vnet.ibm.com>
[BZ #17868]
* sysdeps/powerpc/powerpc64/dl-machine.h (resolve_ifunc): Force value
set dependency from opd value.
2015-01-23 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features):

2
NEWS
View File

@ -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

View File

@ -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