Use an internal symbol to determine library directory. Exported symbols with protected visibility (change made in the next patch) have a relocation type that is incompatible with passing their address to dladdr(). Instead we can use a static local variable. Bug b/110884149 Change-Id: I3e38280276ec00913b28ff97b007490619a99f58 Reviewed-on: https://swiftshader-review.googlesource.com/19710 Reviewed-by: Alexis Hétu <sugoi@google.com> Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Common/SharedLibrary.hpp b/src/Common/SharedLibrary.hpp index 39945f3..8a8c3a1 100644 --- a/src/Common/SharedLibrary.hpp +++ b/src/Common/SharedLibrary.hpp
@@ -89,10 +89,13 @@ return (void*)GetProcAddress((HMODULE)library, name); } - inline std::string getLibraryDirectoryFromSymbol(void* symbol) + inline std::string getModuleDirectory() { + static int dummy_symbol = 0; + HMODULE module = NULL; - GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)symbol, &module); + GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)&dummy_symbol, &module); + char filename[1024]; if(module && (GetModuleFileName(module, filename, sizeof(filename)) != 0)) { @@ -148,10 +151,12 @@ return symbol; } - inline std::string getLibraryDirectoryFromSymbol(void* symbol) + inline std::string getModuleDirectory() { + static int dummy_symbol = 0; + Dl_info dl_info; - if(dladdr(symbol, &dl_info) != 0) + if(dladdr(&dummy_symbol, &dl_info) != 0) { std::string directory(dl_info.dli_fname); return directory.substr(0, directory.find_last_of("\\/") + 1).c_str();
diff --git a/src/OpenGL/libEGL/libEGL.hpp b/src/OpenGL/libEGL/libEGL.hpp index 74ddf65..b6d9d63 100644 --- a/src/OpenGL/libEGL/libEGL.hpp +++ b/src/OpenGL/libEGL/libEGL.hpp
@@ -73,7 +73,7 @@ class LibEGL { public: - LibEGL(const std::string libraryDirectory) : libraryDirectory(libraryDirectory) + LibEGL() { } @@ -118,7 +118,8 @@ #error "libEGL::loadExports unimplemented for this platform" #endif - libEGL = loadLibrary(libraryDirectory, libEGL_lib, "libEGL_swiftshader"); + std::string directory = getModuleDirectory(); + libEGL = loadLibrary(directory, libEGL_lib, "libEGL_swiftshader"); if(libEGL) { @@ -132,7 +133,6 @@ void *libEGL = nullptr; LibEGLexports *libEGLexports = nullptr; - const std::string libraryDirectory; }; #endif // libEGL_hpp
diff --git a/src/OpenGL/libEGL/main.cpp b/src/OpenGL/libEGL/main.cpp index c850610..a1ff6f1 100644 --- a/src/OpenGL/libEGL/main.cpp +++ b/src/OpenGL/libEGL/main.cpp
@@ -649,5 +649,5 @@ return &libEGL; } -LibGLES_CM libGLES_CM(getLibraryDirectoryFromSymbol((void*)libEGL_swiftshader)); -LibGLESv2 libGLESv2(getLibraryDirectoryFromSymbol((void*)libEGL_swiftshader)); +LibGLES_CM libGLES_CM; +LibGLESv2 libGLESv2;
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.hpp b/src/OpenGL/libGLES_CM/libGLES_CM.hpp index 10b8e9a..ae6237b 100644 --- a/src/OpenGL/libGLES_CM/libGLES_CM.hpp +++ b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
@@ -229,7 +229,7 @@ class LibGLES_CM { public: - LibGLES_CM(const std::string libraryDirectory) : libraryDirectory(libraryDirectory) + LibGLES_CM() { } @@ -279,7 +279,8 @@ #error "libGLES_CM::loadExports unimplemented for this platform" #endif - libGLES_CM = loadLibrary(libraryDirectory, libGLES_CM_lib, "libGLES_CM_swiftshader"); + std::string directory = getModuleDirectory(); + libGLES_CM = loadLibrary(directory, libGLES_CM_lib, "libGLES_CM_swiftshader"); if(libGLES_CM) { @@ -293,7 +294,6 @@ void *libGLES_CM = nullptr; LibGLES_CMexports *libGLES_CMexports = nullptr; - const std::string libraryDirectory; }; #endif // libGLES_CM_hpp
diff --git a/src/OpenGL/libGLES_CM/main.cpp b/src/OpenGL/libGLES_CM/main.cpp index ea56c81..f2bd0b7 100644 --- a/src/OpenGL/libGLES_CM/main.cpp +++ b/src/OpenGL/libGLES_CM/main.cpp
@@ -1610,4 +1610,4 @@ return &libGLES_CM; } -LibEGL libEGL(getLibraryDirectoryFromSymbol((void*)libGLES_CM_swiftshader)); +LibEGL libEGL;
diff --git a/src/OpenGL/libGLESv2/entry_points.cpp b/src/OpenGL/libGLESv2/entry_points.cpp index fa52a8b..5460bcd 100644 --- a/src/OpenGL/libGLESv2/entry_points.cpp +++ b/src/OpenGL/libGLESv2/entry_points.cpp
@@ -1426,5 +1426,5 @@ return &libGLESv2; } -LibEGL libEGL(getLibraryDirectoryFromSymbol((void*)libGLESv2_swiftshader)); -LibGLES_CM libGLES_CM(getLibraryDirectoryFromSymbol((void*)libGLESv2_swiftshader)); +LibEGL libEGL; +LibGLES_CM libGLES_CM;
diff --git a/src/OpenGL/libGLESv2/libGLESv2.hpp b/src/OpenGL/libGLESv2/libGLESv2.hpp index cb16caf..247c6fa 100644 --- a/src/OpenGL/libGLESv2/libGLESv2.hpp +++ b/src/OpenGL/libGLESv2/libGLESv2.hpp
@@ -254,7 +254,7 @@ class LibGLESv2 { public: - LibGLESv2(const std::string libraryDirectory) : libraryDirectory(libraryDirectory) + LibGLESv2() { } @@ -304,7 +304,8 @@ #error "libGLESv2::loadExports unimplemented for this platform" #endif - libGLESv2 = loadLibrary(libraryDirectory, libGLESv2_lib, "libGLESv2_swiftshader"); + std::string directory = getModuleDirectory(); + libGLESv2 = loadLibrary(directory, libGLESv2_lib, "libGLESv2_swiftshader"); if(libGLESv2) { @@ -318,7 +319,6 @@ void *libGLESv2 = nullptr; LibGLESv2exports *libGLESv2exports = nullptr; - const std::string libraryDirectory; }; #endif // libGLESv2_hpp