This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, rs6000, 4.8] Fix many powerpc*-linux ASAN test suite failures
- From: Peter Bergner <bergner at vnet dot ibm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: David Edelsohn <dje dot gcc at gmail dot com>, Jakub Jelinek <jakub at redhat dot com>
- Date: Thu, 17 Jul 2014 09:54:18 -0500
- Subject: [PATCH, rs6000, 4.8] Fix many powerpc*-linux ASAN test suite failures
- Authentication-results: sourceware.org; auth=none
With a recent mainline libsanitizer merge from upstream, we're now seeing a
lot of mainline ASAN test suite failures with the following error:
==26426==ASan runtime does not come first in initial library list; you should
either link runtime to your application or manually preload it with LD_PRELOAD.
FAIL: c-c++-common/asan/asan-interface-1.c -O0 execution test
This is caused by mainline libasan detecting that libasan is not linked
first and erroring out. With the 4.8 and 4.9, we may just silently run
into problems. The root cause is that powerpc*-linux does not define
LIBASAN_EARLY_SPEC which is defined in gnu-user.h. It looks like all
*-linux architectures include gnu-user.h except for powerpc*-linux.
As discussed, for the 4.8 and 4.9 backports of the original patch, we
will just copy those defines to the rs6000 header files and not try and
include gnu-user.h itself.
This passed bootstrap and regtesting on powerpc64-linux with no regressions.
Ok for 4.8?
Peter
* config/rs6000/sysv4.h:
Index: gcc/config/rs6000/sysv4.h
===================================================================
--- gcc/config/rs6000/sysv4.h (revision 212695)
+++ gcc/config/rs6000/sysv4.h (working copy)
@@ -949,3 +949,27 @@ ncrtn.o%s"
#define TARGET_USES_SYSV4_OPT 1
#undef DBX_REGISTER_NUMBER
+
+/* Link -lasan early on the command line. For -static-libasan, don't link
+ it for -shared link, the executable should be compiled with -static-libasan
+ in that case, and for executable link link with --{,no-}whole-archive around
+ it to force everything into the executable. And similarly for -ltsan. */
+#if defined(HAVE_LD_STATIC_DYNAMIC)
+#undef LIBASAN_EARLY_SPEC
+#define LIBASAN_EARLY_SPEC "%{!shared:libasan_preinit%O%s} " \
+ "%{static-libasan:%{!shared:" \
+ LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \
+ LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan}"
+#undef LIBTSAN_EARLY_SPEC
+#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \
+ LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \
+ LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan}"
+#endif
+
+/* Additional libraries needed by -static-libasan. */
+#undef STATIC_LIBASAN_LIBS
+#define STATIC_LIBASAN_LIBS "-ldl -lpthread"
+
+/* Additional libraries needed by -static-libtsan. */
+#undef STATIC_LIBTSAN_LIBS
+#define STATIC_LIBTSAN_LIBS "-ldl -lpthread"