From: Petr Hosek Date: Wed, 21 Nov 2018 20:33:12 +0000 (+0000) Subject: [Driver] Use --push/pop-state with Sanitizer link deps X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb1a557450468b15cb27dffafcaeba1a0a715e0d;p=clang [Driver] Use --push/pop-state with Sanitizer link deps Sanitizer runtime link deps handling passes --no-as-needed because of PR15823, but it never undoes it and this flag may affect other libraries that come later on the link line. To avoid this, wrap Sanitizer link deps in --push/pop-state. Differential Revision: https://reviews.llvm.org/D54805 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@347413 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp index 03298a17c3..4f34296488 100644 --- a/lib/Driver/ToolChains/CommonArgs.cpp +++ b/lib/Driver/ToolChains/CommonArgs.cpp @@ -598,6 +598,7 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC, ArgStringList &CmdArgs) { // Force linking against the system libraries sanitizers depends on // (see PR15823 why this is necessary). + CmdArgs.push_back("--push-state"); CmdArgs.push_back("--no-as-needed"); // There's no libpthread or librt on RTEMS & Android. if (TC.getTriple().getOS() != llvm::Triple::RTEMS && @@ -617,6 +618,7 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC, if (TC.getTriple().getOS() == llvm::Triple::NetBSD || TC.getTriple().getOS() == llvm::Triple::FreeBSD) CmdArgs.push_back("-lexecinfo"); + CmdArgs.push_back("--pop-state"); } static void diff --git a/test/Driver/sanitizer-ld.c b/test/Driver/sanitizer-ld.c index 9ce05996fd..d0408eb8c6 100644 --- a/test/Driver/sanitizer-ld.c +++ b/test/Driver/sanitizer-ld.c @@ -220,6 +220,20 @@ // CHECK-ASAN-MYRIAD-NOT: "-lc" // CHECK-ASAN-MYRIAD: libclang_rt.asan-sparcel.a" +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target i386-unknown-linux -fuse-ld=ld -fsanitize=address -static \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-ASAN-LINUX-STATIC %s +// +// CHECK-ASAN-LINUX-STATIC: "--push-state" +// CHECK-ASAN-LINUX-STATIC: "--no-as-needed" +// CHECK-ASAN-LINUX-STATIC: "-lpthread" +// CHECK-ASAN-LINUX-STATIC: "-lrt" +// CHECK-ASAN-LINUX-STATIC: "-lm" +// CHECK-ASAN-LINUX-STATIC: "-ldl" +// CHECK-ASAN-LINUX-STATIC: "--pop-state" + // RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target x86_64-unknown-linux -fuse-ld=ld -stdlib=platform -lstdc++ \ // RUN: -fsanitize=thread \