This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] powerpc: Fix ifuncmain6pie failure with GCC 4.9
- From: Adhemerval Zanella <azanella at linux dot vnet dot ibm dot com>
- To: "GNU C. Library" <libc-alpha at sourceware dot org>
- Cc: "Carlos O'Donell" <carlos at redhat dot com>
- Date: Fri, 23 Jan 2015 14:27:11 -0200
- Subject: [PATCH] powerpc: Fix ifuncmain6pie failure with GCC 4.9
- Authentication-results: sourceware.org; auth=none
This patch fix the elf/ifuncmain6pie failure when building with GCC
4.9+. For some reason, the compiler removes if condition at
resolve_ifunc (sysdeps/powerpc/powerpc64/dl-machine.h) as dead-code
and thus the testcase fails because it branches to an invalid memory
location.
It fixes my explicit adding a dependency of value based on
odp variable to avoid compiler optimization.
It fixes BZ#17868.
Tested on powerpc64 and powerp64le with GCC 4.9 and GCC 4.8.
Carlos, I would like to push it for 2.21.
--
* sysdeps/powerpc/powerpc64/dl-machine.h (resolve_ifunc): Force value
set dependency from opd value.
--
diff --git a/NEWS b/NEWS
index fd6da90..00115a7 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
+ 17844, 17848, 17868.
* 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