[compiler-rt] r243879 - [asan] Fix dyld version detection on OS X

Kuba Brecka kuba.brecka at gmail.com
Mon Aug 3 07:48:59 PDT 2015


Author: kuba.brecka
Date: Mon Aug  3 09:48:59 2015
New Revision: 243879

URL: http://llvm.org/viewvc/llvm-project?rev=243879&view=rev
Log:
[asan] Fix dyld version detection on OS X

We currently have a dyld check in DyldNeedsEnvVariable that detects whether we are on a new OS X (10.11+) where we don't need to re-exec. For iOS simulator, we have a dlsym() hack that checks for a specific symbol, but this turns out to be fragile and problematic, because dlsym can sometimes call malloc(), which is not a good idea this early in the process runtime.

Let's instead of this do a direct comparison of dyld's version, which is exported in a public symbol `dyldVersionNumber`.

Differential Revision: http://reviews.llvm.org/D11719


Modified:
    compiler-rt/trunk/lib/asan/asan_mac.cc

Modified: compiler-rt/trunk/lib/asan/asan_mac.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_mac.cc?rev=243879&r1=243878&r2=243879&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_mac.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_mac.cc Mon Aug  3 09:48:59 2015
@@ -99,21 +99,16 @@ void DisableReexec() {
   reexec_disabled = true;
 }
 
-bool DyldNeedsEnvVariable() {
-// If running on OS X 10.11+ or iOS 9.0+, dyld will interpose even if
-// DYLD_INSERT_LIBRARIES is not set.
-
-#if SANITIZER_IOSSIM
-  // GetMacosVersion will not work for the simulator, whose kernel version
-  // is tied to the host. Use a weak linking hack for the simulator.
-  // This API was introduced in the same version of the OS as the dyld
-  // optimization.
+extern "C" double dyldVersionNumber;
+static const double kMinDyldVersionWithAutoInterposition = 360.0;
 
-  // Check for presence of a symbol that is available on OS X 10.11+, iOS 9.0+.
-  return (dlsym(RTLD_NEXT, "mach_memory_info") == nullptr);
-#else
-  return (GetMacosVersion() <= MACOS_VERSION_YOSEMITE);
-#endif
+bool DyldNeedsEnvVariable() {
+  // If running on OS X 10.11+ or iOS 9.0+, dyld will interpose even if
+  // DYLD_INSERT_LIBRARIES is not set. However, checking OS version via
+  // GetMacosVersion() doesn't work for the simulator. Let's instead check
+  // `dyldVersionNumber`, which is exported by dyld, against a known version
+  // number from the first OS release where this appeared.
+  return dyldVersionNumber < kMinDyldVersionWithAutoInterposition;
 }
 
 void MaybeReexec() {





More information about the llvm-commits mailing list