From: Kostya Serebryany Date: Tue, 6 Dec 2011 19:18:44 +0000 (+0000) Subject: [asan] Mac: do not link dynamic libs with the asan-rt, use -undefined dynamic_lookup... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7b5f1013c5b7f541dc1fae7fc43189377874eabb;p=clang [asan] Mac: do not link dynamic libs with the asan-rt, use -undefined dynamic_lookup for dynamic libs. Style fixes. Patch by glider@google.com git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145955 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 245b3e8308..77831be998 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -467,9 +467,12 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, } } - // Add ASAN runtime library, if required. + // Add ASAN runtime library, if required. Dynamic libraries and bundles + // should not be linked with the runtime library. if (Args.hasFlag(options::OPT_faddress_sanitizer, options::OPT_fno_address_sanitizer, false)) { + if (Args.hasArg(options::OPT_dynamiclib) || + Args.hasArg(options::OPT_bundle)) return; if (isTargetIPhoneOS()) { getDriver().Diag(diag::err_drv_clang_unsupported_per_platform) << "-faddress-sanitizer"; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 4987b0a81f..2d95aec080 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1103,13 +1103,13 @@ static bool UseRelaxAll(Compilation &C, const ArgList &Args) { /// If AddressSanitizer is enabled, add appropriate linker flags (Linux). /// This needs to be called before we add the C run-time (malloc, etc). static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args, - ArgStringList &CmdArgs) { + ArgStringList &CmdArgs) { // Add asan linker flags when linking an executable, but not a shared object. if (Args.hasArg(options::OPT_shared) || !Args.hasFlag(options::OPT_faddress_sanitizer, options::OPT_fno_address_sanitizer, false)) return; - // LibAsan is "../lib/clang/linux/ArchName/libclang_rt.asan.a + // LibAsan is "../lib/clang/linux/ArchName/libclang_rt.asan.a" llvm::SmallString<128> LibAsan = llvm::sys::path::parent_path(StringRef(TC.getDriver().Dir)); llvm::sys::path::append(LibAsan, "lib", "clang", "linux", TC.getArchName()); @@ -3586,6 +3586,18 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, Args.AddAllArgs(CmdArgs, options::OPT_L); + // If we're building a dynamic lib with -faddress-sanitizer, unresolved + // symbols may appear. Mark all of them as dynamic_lookup. + // Linking executables is handled in lib/Driver/ToolChains.cpp. + if (Args.hasFlag(options::OPT_faddress_sanitizer, + options::OPT_fno_address_sanitizer, false)) { + if (Args.hasArg(options::OPT_dynamiclib) || + Args.hasArg(options::OPT_bundle)) { + CmdArgs.push_back("-undefined"); + CmdArgs.push_back("dynamic_lookup"); + } + } + if (Args.hasArg(options::OPT_fopenmp)) // This is more complicated in gcc... CmdArgs.push_back("-lgomp");