[PATCH] D33529: Allow clients to specify search order of DynamicLibraries.

Frederich Munch via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 26 17:35:47 PDT 2017


marsupial updated this revision to Diff 100512.
marsupial retitled this revision from "Allow clients to specify search order of DynamicLibraries (in the JIT as well)." to "Allow clients to specify search order of DynamicLibraries.".
marsupial edited the summary of this revision.

https://reviews.llvm.org/D33529

Files:
  include/llvm/Support/DynamicLibrary.h
  lib/Support/DynamicLibrary.cpp


Index: lib/Support/DynamicLibrary.cpp
===================================================================
--- lib/Support/DynamicLibrary.cpp
+++ lib/Support/DynamicLibrary.cpp
@@ -74,18 +74,27 @@
   }
 
   void *Lookup(const char *Symbol) {
-    // Process handle gets first try.
+    // Iterate in reverse, so newer libraries/symbols override older.
+    for (auto &&I = Handles.rbegin(), E = Handles.rend(); I != E; ++I) {
+      if (void *Ptr = DLSym(*I, Symbol))
+        return Ptr;
+    }
+    return nullptr;
+  }
+
+  void *Lookup(const char *Symbol, DynamicLibrary::SearchOrdering Order) {
+    if (!Process || Order == DynamicLibrary::SO_LoadedFirst) {
+      if (void *Ptr = Lookup(Symbol))
+        return Ptr;
+    }
     if (Process) {
+      // Use OS facilities to search the current binary and all loaded libs.
       if (void *Ptr = DLSym(Process, Symbol))
         return Ptr;
-#ifndef NDEBUG
-      for (void *Handle : Handles)
-        assert(!DLSym(Handle, Symbol) && "Symbol exists in non process handle");
-#endif
-    } else {
-      // Iterate in reverse, so newer libraries/symbols override older.
-      for (auto &&I = Handles.rbegin(), E = Handles.rend(); I != E; ++I) {
-        if (void *Ptr = DLSym(*I, Symbol))
+
+      // Search any libs that might have been skipped because of RTLD_LOCAL.
+      if (Order == DynamicLibrary::SO_LoadedLast) {
+        if (void *Ptr = Lookup(Symbol))
           return Ptr;
       }
     }
@@ -113,6 +122,7 @@
 #endif
 
 char DynamicLibrary::Invalid;
+DynamicLibrary::SearchOrdering SearchOrder = DynamicLibrary::SO_Linker;
 
 namespace llvm {
 void *SearchForAddressOfSpecialSymbol(const char *SymbolName) {
@@ -170,7 +180,7 @@
 
     // Now search the libraries.
     if (OpenedHandles.isConstructed()) {
-      if (void *Ptr = OpenedHandles->Lookup(SymbolName))
+      if (void *Ptr = OpenedHandles->Lookup(SymbolName, SearchOrder))
         return Ptr;
     }
   }
Index: include/llvm/Support/DynamicLibrary.h
===================================================================
--- include/llvm/Support/DynamicLibrary.h
+++ include/llvm/Support/DynamicLibrary.h
@@ -88,6 +88,19 @@
       return !getPermanentLibrary(Filename, ErrMsg).isValid();
     }
 
+    enum SearchOrdering {
+      /// SO_Linker - Search as a call to dlsym(dlopen(NULL)) would when
+      /// DynamicLibrary::getPermanentLibrary(NULL) has been called or
+      /// search the list of explcitly loaded symbols if not.
+      SO_Linker,
+      /// SO_LoadedFirst - Search all loaded libraries then as SO_Linker would
+      SO_LoadedFirst,
+      /// SO_LoadedLast - Search as SO_Linker would, then loaded libraries.
+      /// Only usefull to search libraries with RTLD_LOCAL have been added.
+      SO_LoadedLast,
+    };
+    static SearchOrdering SearchOrder; // = SO_Linker
+
     /// This function will search through all previously loaded dynamic
     /// libraries for the symbol \p symbolName. If it is found, the address of
     /// that symbol is returned. If not, null is returned. Note that this will


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33529.100512.patch
Type: text/x-patch
Size: 3057 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170527/139edcf9/attachment.bin>


More information about the llvm-commits mailing list