[PATCH] D11719: [asan] Fix dyld version detection on OS X

Kuba Brecka kuba.brecka at gmail.com
Mon Aug 3 06:46:56 PDT 2015


kubabrecka created this revision.
kubabrecka added reviewers: samsonov, glider, kcc.
kubabrecka added subscribers: llvm-commits, samsonov, glider, kcc, zaks.anna.

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`.

http://reviews.llvm.org/D11719

Files:
  lib/asan/asan_mac.cc

Index: lib/asan/asan_mac.cc
===================================================================
--- lib/asan/asan_mac.cc
+++ lib/asan/asan_mac.cc
@@ -99,21 +99,17 @@
   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.
+extern "C" double dyldVersionNumber;
+static const double kMinDyldVersionWithAutoInterposition = 360.0;
 
-#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.
+bool DyldNeedsEnvVariable() {
+  // If running on OS X 10.11+ or iOS 9.0+, dyld will interpose even if
+  // DYLD_INSERT_LIBRARIES is not set.
 
-  // 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
+  // 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 OS release where this appeared.
+  return dyldVersionNumber < kMinDyldVersionWithAutoInterposition;
 }
 
 void MaybeReexec() {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11719.31228.patch
Type: text/x-patch
Size: 1397 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150803/2ed2f6a2/attachment.bin>


More information about the llvm-commits mailing list