]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
powerpc: Fix ifuncmain6pie failure with GCC 4.9
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Fri, 23 Jan 2015 16:16:49 +0000 (11:16 -0500)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Sat, 24 Jan 2015 13:38:39 +0000 (08:38 -0500)
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
NEWS
sysdeps/powerpc/powerpc64/dl-machine.h

index d746e18d59a035ced96ee3497ac3f065aad2016b..cd093808ff4c79d3d5d9c4136bd4d344b1062045 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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):
diff --git a/NEWS b/NEWS
index 0ce43521eaec6832601c5eac8d6451c2c6751d78..f9ea7cf697e3b3982afa82fb0a1297ffc0116f65 100644 (file)
--- 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
index 944871223fc0ff3fe42412708652750c0dbbe23b..47bb5a7cb7a16da00352caab47ce653a2d3a3c73 100644 (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