From c6496816b1868fae52cd5e188202ddea12dbb366 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Mon, 30 Jun 2014 20:27:16 +0000 Subject: [PATCH] [UBSan] Don't link UBSan runtime into shared libraries. It used to be a feature of UBSan (it could sanitize a standalone shared object instead of the whole program), but now it causes more problems, like PR20165. llvm-svn: 212064 --- clang/lib/Driver/Tools.cpp | 12 +++++------- clang/test/Driver/sanitizer-ld.c | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index f5d7994..093c936 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -2039,23 +2039,21 @@ static void addLsanRT(const ToolChain &TC, const ArgList &Args, static void addUbsanRT(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, bool IsCXX, bool HasOtherSanitizerRt) { - // Export symbols if we're not building a shared library. This allows two - // models: either every DSO containing ubsan-sanitized code contains the - // ubsan runtime, or the main executable does (or both). - const bool ExportSymbols = !Args.hasArg(options::OPT_shared); + // Do not link runtime into shared libraries. + if (Args.hasArg(options::OPT_shared)) + return; // Need a copy of sanitizer_common. This could come from another sanitizer // runtime; if we're not including one, include our own copy. if (!HasOtherSanitizerRt) addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false); - addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, ExportSymbols); + addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, true); // Only include the bits of the runtime which need a C++ ABI library if // we're linking in C++ mode. if (IsCXX) - addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, - ExportSymbols); + addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, true); } static void addDfsanRT(const ToolChain &TC, const ArgList &Args, diff --git a/clang/test/Driver/sanitizer-ld.c b/clang/test/Driver/sanitizer-ld.c index 14b14b2..786262c 100644 --- a/clang/test/Driver/sanitizer-ld.c +++ b/clang/test/Driver/sanitizer-ld.c @@ -246,7 +246,7 @@ // CHECK-UBSAN-LINUX-SHARED: "{{.*}}ld{{(.exe)?}}" // CHECK-UBSAN-LINUX-SHARED-NOT: --export-dynamic // CHECK-UBSAN-LINUX-SHARED-NOT: --dynamic-list -// CHECK-UBSAN-LINUX-SHARED: libclang_rt.ubsan-i386.a" +// CHECK-UBSAN-LINUX-SHARED-NOT: libclang_rt.ubsan-i386.a" // CHECK-UBSAN-LINUX-SHARED-NOT: --export-dynamic // CHECK-UBSAN-LINUX-SHARED-NOT: --dynamic-list -- 2.7.4