diff options
author | Kostya Serebryany <kcc@google.com> | 2011-12-06 19:18:44 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2011-12-06 19:18:44 +0000 |
commit | 7b5f1013c5b7f541dc1fae7fc43189377874eabb (patch) | |
tree | b8c0de5c54d4b4fa7ed55a430580e1b1ca2629c3 /lib/Driver/Tools.cpp | |
parent | ef85b56bfee855823756a6f46ee50a8c7cc5f3a6 (diff) |
[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
Diffstat (limited to 'lib/Driver/Tools.cpp')
-rw-r--r-- | lib/Driver/Tools.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
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"); |