From bb97c3d5d0ba5f811b4671b98ee10909b79df542 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 4 Jun 2014 23:28:46 +0000 Subject: [PATCH] [ubsan] Don't add a --dynamic-list for ubsan symbols when building a shared library. That results in the linker resolving all references to weak symbols in the DSO to the definition from within that DSO. Ironically, this rarely causes observable problems, except that it causes ubsan's own dynamic type check to spuriously fail (because we fail to properly merge type_info object names). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210220 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/Tools.cpp | 10 ++++++++-- test/Driver/sanitizer-ld.c | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index ee3b7ff342..7817f82615 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2033,17 +2033,23 @@ 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); + // 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); + addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, ExportSymbols); // 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); + addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, + ExportSymbols); } static void addDfsanRT(const ToolChain &TC, const ArgList &Args, diff --git a/test/Driver/sanitizer-ld.c b/test/Driver/sanitizer-ld.c index 405e3a6166..cb29370783 100644 --- a/test/Driver/sanitizer-ld.c +++ b/test/Driver/sanitizer-ld.c @@ -189,6 +189,7 @@ // RUN: %clangxx -fsanitize=undefined %s -### -o %t.o 2>&1 \ // RUN: -target i386-unknown-linux \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ // RUN: --sysroot=%S/Inputs/basic_linux_tree \ // RUN: | FileCheck --check-prefix=CHECK-UBSAN-LINUX-CXX %s // CHECK-UBSAN-LINUX-CXX: "{{.*}}ld{{(.exe)?}}" @@ -196,8 +197,10 @@ // CHECK-UBSAN-LINUX-CXX: "-whole-archive" "{{.*}}libclang_rt.san-i386.a" "-no-whole-archive" // CHECK-UBSAN-LINUX-CXX-NOT: libclang_rt.asan // CHECK-UBSAN-LINUX-CXX: "-whole-archive" "{{.*}}libclang_rt.ubsan-i386.a" "-no-whole-archive" +// CHECK-UBSAN-LINUX-CXX: "--dynamic-list={{.*}}libclang_rt.ubsan-i386.a.syms" // CHECK-UBSAN-LINUX-CXX: "-whole-archive" "{{.*}}libclang_rt.ubsan_cxx-i386.a" "-no-whole-archive" // CHECK-UBSAN-LINUX-CXX: "-lpthread" +// CHECK-UBSAN-LINUX-CXX: "--dynamic-list={{.*}}libclang_rt.ubsan_cxx-i386.a.syms" // CHECK-UBSAN-LINUX-CXX: "-lstdc++" // RUN: %clang -fsanitize=address,undefined %s -### -o %t.o 2>&1 \ @@ -228,11 +231,16 @@ // RUN: %clang -fsanitize=undefined %s -### -o %t.o 2>&1 \ // RUN: -target i386-unknown-linux \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ // RUN: --sysroot=%S/Inputs/basic_linux_tree \ // RUN: -shared \ // RUN: | FileCheck --check-prefix=CHECK-UBSAN-LINUX-SHARED %s // 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: --export-dynamic +// CHECK-UBSAN-LINUX-SHARED-NOT: --dynamic-list // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target x86_64-unknown-linux -fsanitize=leak \ -- 2.50.1