From: Chao-ying Fu <c...@wavecomp.com> In case of cross toolchain build, where GCC libraries are not installed within the designated sysroot, the shared sanitizer libraries link against libstdc++.so within the same directory. However this directory is not in RPATH, so attempting to build a dynamically linked application with -fsanitize=xx gives a linkage error. In the opinion of libsanitizer maintainer, this is a problem with the tree structure of the installation.
See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69839 Specifying an explicit -rpath-link is not a problem for the end-user, but this problem also causes target checks for libasan regression tests to fail. In order to be able to run regression tests on a cross toolchain, this patch hacks the gcc driver and adds the requisite -rpath-link option automatically for -fsanitize=address/undefined relative to toolchain sysroot. gcc/ * gcc.cc (LIBSAN_RPATH): New macro. (LIBASAN_SPEC): Add LIBSAN_RPATH. (LIBUBSAN_SPEC): Likewise. (LIBTSAN_SPEC): Likewise. (LIBLSAN_SPEC): Likewise. libsanitizer/ * configure.ac (link_libsan_rpath): New config variable. * libsanitizer.spec.in (link_libsan_rpath): New spec. * configure: Regenerate with autoconf 2.69 * Makefile.in: Regenerate with automake 1.15.1. * asan/Makefile.in: Likewise. * interception/Makefile.in: Likewise. * libbacktrace/Makefile.in: Likewise. * lsan/Makefile.in: Likewise. * sanitizer_common/Makefile.in: Likewise. * tsan/Makefile.in: Likewise. * ubsan/Makefile.in: Likewise. * hwasan/Makefile.in: Likewise. Cherry-picked e45e8831afb40eddfa82bedf7fc5536619d7382f, 25c48b961e16748cfa468830040a865ece7dd235 and 96b7557473a09bb181be86c741c6e79a4a3c41b1 from https://github.com/MIPS/gcc Signed-off-by: Faraz Shahbazker <fshahbaz...@wavecomp.com> Signed-off-by: Chao-ying Fu <c...@mips.com> Signed-off-by: Aleksandar Rakic <aleksandar.ra...@htecgroup.com> --- gcc/gcc.cc | 20 ++++++++++++-------- libsanitizer/Makefile.in | 1 + libsanitizer/asan/Makefile.in | 1 + libsanitizer/configure | 14 ++++++++++++-- libsanitizer/configure.ac | 9 +++++++++ libsanitizer/hwasan/Makefile.in | 1 + libsanitizer/interception/Makefile.in | 1 + libsanitizer/libbacktrace/Makefile.in | 1 + libsanitizer/libsanitizer.spec.in | 2 ++ libsanitizer/lsan/Makefile.in | 1 + libsanitizer/sanitizer_common/Makefile.in | 1 + libsanitizer/tsan/Makefile.in | 1 + libsanitizer/ubsan/Makefile.in | 1 + 13 files changed, 44 insertions(+), 10 deletions(-) diff --git a/gcc/gcc.cc b/gcc/gcc.cc index 5fe5fd86a98..20a165762e9 100644 --- a/gcc/gcc.cc +++ b/gcc/gcc.cc @@ -765,17 +765,21 @@ proper position among the other output files. */ #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}" #endif +#ifndef LIBSAN_RPATH +#define LIBSAN_RPATH " %:include(libsanitizer.spec)%(link_libsan_rpath)" +#endif + #ifndef LIBASAN_SPEC #define STATIC_LIBASAN_LIBS \ " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}" #ifdef LIBASAN_EARLY_SPEC -#define LIBASAN_SPEC STATIC_LIBASAN_LIBS +#define LIBASAN_SPEC STATIC_LIBASAN_LIBS LIBSAN_RPATH #elif defined(HAVE_LD_STATIC_DYNAMIC) #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \ "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \ STATIC_LIBASAN_LIBS #else -#define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS +#define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS LIBSAN_RPATH #endif #endif @@ -805,13 +809,13 @@ proper position among the other output files. */ #define STATIC_LIBTSAN_LIBS \ " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}" #ifdef LIBTSAN_EARLY_SPEC -#define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS +#define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS LIBSAN_RPATH #elif defined(HAVE_LD_STATIC_DYNAMIC) #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \ "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \ STATIC_LIBTSAN_LIBS #else -#define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS +#define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS LIBSAN_RPATH #endif #endif @@ -823,13 +827,13 @@ proper position among the other output files. */ #define STATIC_LIBLSAN_LIBS \ " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}" #ifdef LIBLSAN_EARLY_SPEC -#define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS +#define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS LIBSAN_RPATH #elif defined(HAVE_LD_STATIC_DYNAMIC) #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \ "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \ STATIC_LIBLSAN_LIBS #else -#define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS +#define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS LIBSAN_RPATH #endif #endif @@ -843,9 +847,9 @@ proper position among the other output files. */ #ifdef HAVE_LD_STATIC_DYNAMIC #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \ "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \ - STATIC_LIBUBSAN_LIBS + STATIC_LIBUBSAN_LIBS LIBSAN_RPATH #else -#define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS +#define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS LIBSAN_RPATH #endif #endif diff --git a/libsanitizer/Makefile.in b/libsanitizer/Makefile.in index f11219cae84..16eda5dffc7 100644 --- a/libsanitizer/Makefile.in +++ b/libsanitizer/Makefile.in @@ -334,6 +334,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ diff --git a/libsanitizer/asan/Makefile.in b/libsanitizer/asan/Makefile.in index ef4b65dda97..d737e6fc94c 100644 --- a/libsanitizer/asan/Makefile.in +++ b/libsanitizer/asan/Makefile.in @@ -387,6 +387,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ diff --git a/libsanitizer/configure b/libsanitizer/configure index 6bfd28916d2..eed0e6d62fc 100755 --- a/libsanitizer/configure +++ b/libsanitizer/configure @@ -661,6 +661,7 @@ link_libubsan link_libtsan link_libhwasan link_libasan +link_libsan_rpath HWASAN_SUPPORTED_FALSE HWASAN_SUPPORTED_TRUE LSAN_SUPPORTED_FALSE @@ -12475,7 +12476,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12478 "configure" +#line 12479 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12581,7 +12582,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12584 "configure" +#line 12585 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -16132,6 +16133,15 @@ if test "x$ac_cv_lib_dl_dlsym" = xyes; then : fi +lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS \ + -print-multi-os-directory 2>/dev/null` +if test -n "$with_cross_host" && + test x"$with_cross_host" != x"no"; then + link_libsan_rpath="-rpath-link=%R/../../${target_alias}/lib/" + link_libsan_rpath="${link_libsan_rpath}$lt_multi_os_dir" +fi + + # Set up the set of additional libraries that we need to link against for libasan. link_libasan=$link_sanitizer_common diff --git a/libsanitizer/configure.ac b/libsanitizer/configure.ac index 8037c941774..db515303a09 100644 --- a/libsanitizer/configure.ac +++ b/libsanitizer/configure.ac @@ -120,6 +120,15 @@ AC_CHECK_LIB(rt, shm_open, AC_CHECK_LIB(dl, dlsym, [link_sanitizer_common="-ldl $link_sanitizer_common"]) +lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS \ + -print-multi-os-directory 2>/dev/null` +if test -n "$with_cross_host" && + test x"$with_cross_host" != x"no"; then + link_libsan_rpath="-rpath-link=%R/../../${target_alias}/lib/" + link_libsan_rpath="${link_libsan_rpath}$lt_multi_os_dir" +fi +AC_SUBST(link_libsan_rpath) + # Set up the set of additional libraries that we need to link against for libasan. link_libasan=$link_sanitizer_common AC_SUBST(link_libasan) diff --git a/libsanitizer/hwasan/Makefile.in b/libsanitizer/hwasan/Makefile.in index 4420bd6a7a9..dd6db8773b4 100644 --- a/libsanitizer/hwasan/Makefile.in +++ b/libsanitizer/hwasan/Makefile.in @@ -380,6 +380,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ diff --git a/libsanitizer/interception/Makefile.in b/libsanitizer/interception/Makefile.in index 2d807c98d3b..1f06c1c7e3d 100644 --- a/libsanitizer/interception/Makefile.in +++ b/libsanitizer/interception/Makefile.in @@ -306,6 +306,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ diff --git a/libsanitizer/libbacktrace/Makefile.in b/libsanitizer/libbacktrace/Makefile.in index 33faa78bb43..d60f85f774f 100644 --- a/libsanitizer/libbacktrace/Makefile.in +++ b/libsanitizer/libbacktrace/Makefile.in @@ -356,6 +356,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ diff --git a/libsanitizer/libsanitizer.spec.in b/libsanitizer/libsanitizer.spec.in index 70a33574d7b..1df604335d5 100644 --- a/libsanitizer/libsanitizer.spec.in +++ b/libsanitizer/libsanitizer.spec.in @@ -11,3 +11,5 @@ *link_liblsan: @link_liblsan@ +*link_libsan_rpath: @link_libsan_rpath@ + diff --git a/libsanitizer/lsan/Makefile.in b/libsanitizer/lsan/Makefile.in index 0870f9e7136..80b538ddfdf 100644 --- a/libsanitizer/lsan/Makefile.in +++ b/libsanitizer/lsan/Makefile.in @@ -351,6 +351,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ diff --git a/libsanitizer/sanitizer_common/Makefile.in b/libsanitizer/sanitizer_common/Makefile.in index df7a2549129..f27221df485 100644 --- a/libsanitizer/sanitizer_common/Makefile.in +++ b/libsanitizer/sanitizer_common/Makefile.in @@ -344,6 +344,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ diff --git a/libsanitizer/tsan/Makefile.in b/libsanitizer/tsan/Makefile.in index 5bbdf3915b8..0382d436e99 100644 --- a/libsanitizer/tsan/Makefile.in +++ b/libsanitizer/tsan/Makefile.in @@ -380,6 +380,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ diff --git a/libsanitizer/ubsan/Makefile.in b/libsanitizer/ubsan/Makefile.in index 717d1571556..967dc180f10 100644 --- a/libsanitizer/ubsan/Makefile.in +++ b/libsanitizer/ubsan/Makefile.in @@ -345,6 +345,7 @@ libexecdir = @libexecdir@ link_libasan = @link_libasan@ link_libhwasan = @link_libhwasan@ link_liblsan = @link_liblsan@ +link_libsan_rpath = @link_libsan_rpath@ link_libtsan = @link_libtsan@ link_libubsan = @link_libubsan@ localedir = @localedir@ -- 2.34.1