aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/Tools.cpp
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2011-12-06 19:18:44 +0000
committerKostya Serebryany <kcc@google.com>2011-12-06 19:18:44 +0000
commit7b5f1013c5b7f541dc1fae7fc43189377874eabb (patch)
treeb8c0de5c54d4b4fa7ed55a430580e1b1ca2629c3 /lib/Driver/Tools.cpp
parentef85b56bfee855823756a6f46ee50a8c7cc5f3a6 (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.cpp16
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");