[03/61] Fix libsanitizer linkage options for cross toolchains

Message ID 20250131171232.1018281-5-aleksandar.rakic@htecgroup.com
State New
Headers
Series Improve Mips target |

Commit Message

Aleksandar Rakic Jan. 31, 2025, 5:13 p.m. UTC
  From: Chao-ying Fu <cfu@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 <fshahbazker@wavecomp.com>
Signed-off-by: Chao-ying Fu <cfu@mips.com>
Signed-off-by: Aleksandar Rakic <aleksandar.rakic@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(-)
  

Patch

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@