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:
parent
972af9e8dd
commit
0e87343e20
@ -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>
|
2015-01-23 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features):
|
* sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features):
|
||||||
|
2
NEWS
2
NEWS
@ -18,7 +18,7 @@ Version 2.21
|
|||||||
17664, 17665, 17668, 17682, 17702, 17717, 17719, 17722, 17723, 17724,
|
17664, 17665, 17668, 17682, 17702, 17717, 17719, 17722, 17723, 17724,
|
||||||
17725, 17732, 17733, 17744, 17745, 17746, 17747, 17748, 17775, 17777,
|
17725, 17732, 17733, 17744, 17745, 17746, 17747, 17748, 17775, 17777,
|
||||||
17780, 17781, 17782, 17791, 17793, 17796, 17797, 17803, 17806, 17834,
|
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
|
* A new semaphore algorithm has been implemented in generic C code for all
|
||||||
machines. Previous custom assembly implementations of semaphore were
|
machines. Previous custom assembly implementations of semaphore were
|
||||||
|
@ -623,7 +623,9 @@ resolve_ifunc (Elf64_Addr value,
|
|||||||
opd.fd_func = func->fd_func + sym_map->l_addr;
|
opd.fd_func = func->fd_func + sym_map->l_addr;
|
||||||
opd.fd_toc = func->fd_toc + sym_map->l_addr;
|
opd.fd_toc = func->fd_toc + sym_map->l_addr;
|
||||||
opd.fd_aux = func->fd_aux;
|
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
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user