]> granicus.if.org Git - clang/commitdiff
[asan] Mac: do not link dynamic libs with the asan-rt, use -undefined dynamic_lookup...
authorKostya Serebryany <kcc@google.com>
Tue, 6 Dec 2011 19:18:44 +0000 (19:18 +0000)
committerKostya Serebryany <kcc@google.com>
Tue, 6 Dec 2011 19:18:44 +0000 (19:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145955 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/ToolChains.cpp
lib/Driver/Tools.cpp

index 245b3e83084d3c4541b0709c4d23be890d92ddd3..77831be99826b1c5785eb7d16459928205a482c3 100644 (file)
@@ -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";
index 4987b0a81f05a6027a51ca83a8d5483037be824a..2d95aec0800ec901e12a1cb54e69929d8c14bf6b 100644 (file)
@@ -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");