forked from OSchip/llvm-project
[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 llvm-svn: 243879
This commit is contained in:
parent
f607111d95
commit
fe17cee960
|
@ -99,21 +99,16 @@ void DisableReexec() {
|
|||
reexec_disabled = true;
|
||||
}
|
||||
|
||||
extern "C" double dyldVersionNumber;
|
||||
static const double kMinDyldVersionWithAutoInterposition = 360.0;
|
||||
|
||||
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.
|
||||
|
||||
// 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
|
||||
// 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() {
|
||||
|
|
Loading…
Reference in New Issue