From 70d2d3cd4519893bff442b14d09883e03565f2a1 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Wed, 27 Aug 2014 17:06:22 +0000 Subject: [PATCH] Limit the symbol search in DynamicLibrary to the module that was opened. Differential Revision: http://reviews.llvm.org/D5030 Reviewed By: Reid Kleckner, Rafael Espindola git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216563 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/DynamicLibrary.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/Support/DynamicLibrary.cpp b/lib/Support/DynamicLibrary.cpp index d2b551e8a0a..40072636608 100644 --- a/lib/Support/DynamicLibrary.cpp +++ b/lib/Support/DynamicLibrary.cpp @@ -56,8 +56,15 @@ static DenseSet *OpenedHandles = nullptr; DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename, std::string *errMsg) { SmartScopedLock lock(*SymbolsMutex); - - void *handle = dlopen(filename, RTLD_LAZY|RTLD_GLOBAL); + int flags = RTLD_LAZY | RTLD_GLOBAL; +#if defined(__APPLE__) + // RTLD_FIRST is an apple specific flag which causes dlsym() to search only + // the module specified in |filename|, and not dependent modules. This + // behavior would be desirable for other platforms as well, except that + // there's not a good way to implement it. + flags |= RTLD_FIRST; +#endif + void *handle = dlopen(filename, flags); if (!handle) { if (errMsg) *errMsg = dlerror(); return DynamicLibrary();