Commit 5e1520fa by Nicolas Capens Committed by Nicolas Capens

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/19710Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 499bb76a
...@@ -89,10 +89,13 @@ void *loadLibrary(const std::string &libraryDirectory, const char *(&names)[n], ...@@ -89,10 +89,13 @@ void *loadLibrary(const std::string &libraryDirectory, const char *(&names)[n],
return (void*)GetProcAddress((HMODULE)library, name); return (void*)GetProcAddress((HMODULE)library, name);
} }
inline std::string getLibraryDirectoryFromSymbol(void* symbol) inline std::string getModuleDirectory()
{ {
static int dummy_symbol = 0;
HMODULE module = NULL; 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]; char filename[1024];
if(module && (GetModuleFileName(module, filename, sizeof(filename)) != 0)) if(module && (GetModuleFileName(module, filename, sizeof(filename)) != 0))
{ {
...@@ -148,10 +151,12 @@ void *loadLibrary(const std::string &libraryDirectory, const char *(&names)[n], ...@@ -148,10 +151,12 @@ void *loadLibrary(const std::string &libraryDirectory, const char *(&names)[n],
return symbol; return symbol;
} }
inline std::string getLibraryDirectoryFromSymbol(void* symbol) inline std::string getModuleDirectory()
{ {
static int dummy_symbol = 0;
Dl_info dl_info; Dl_info dl_info;
if(dladdr(symbol, &dl_info) != 0) if(dladdr(&dummy_symbol, &dl_info) != 0)
{ {
std::string directory(dl_info.dli_fname); std::string directory(dl_info.dli_fname);
return directory.substr(0, directory.find_last_of("\\/") + 1).c_str(); return directory.substr(0, directory.find_last_of("\\/") + 1).c_str();
......
...@@ -73,7 +73,7 @@ public: ...@@ -73,7 +73,7 @@ public:
class LibEGL class LibEGL
{ {
public: public:
LibEGL(const std::string libraryDirectory) : libraryDirectory(libraryDirectory) LibEGL()
{ {
} }
...@@ -118,7 +118,8 @@ private: ...@@ -118,7 +118,8 @@ private:
#error "libEGL::loadExports unimplemented for this platform" #error "libEGL::loadExports unimplemented for this platform"
#endif #endif
libEGL = loadLibrary(libraryDirectory, libEGL_lib, "libEGL_swiftshader"); std::string directory = getModuleDirectory();
libEGL = loadLibrary(directory, libEGL_lib, "libEGL_swiftshader");
if(libEGL) if(libEGL)
{ {
...@@ -132,7 +133,6 @@ private: ...@@ -132,7 +133,6 @@ private:
void *libEGL = nullptr; void *libEGL = nullptr;
LibEGLexports *libEGLexports = nullptr; LibEGLexports *libEGLexports = nullptr;
const std::string libraryDirectory;
}; };
#endif // libEGL_hpp #endif // libEGL_hpp
...@@ -649,5 +649,5 @@ extern "C" EGLAPI LibEGLexports *libEGL_swiftshader() ...@@ -649,5 +649,5 @@ extern "C" EGLAPI LibEGLexports *libEGL_swiftshader()
return &libEGL; return &libEGL;
} }
LibGLES_CM libGLES_CM(getLibraryDirectoryFromSymbol((void*)libEGL_swiftshader)); LibGLES_CM libGLES_CM;
LibGLESv2 libGLESv2(getLibraryDirectoryFromSymbol((void*)libEGL_swiftshader)); LibGLESv2 libGLESv2;
...@@ -229,7 +229,7 @@ public: ...@@ -229,7 +229,7 @@ public:
class LibGLES_CM class LibGLES_CM
{ {
public: public:
LibGLES_CM(const std::string libraryDirectory) : libraryDirectory(libraryDirectory) LibGLES_CM()
{ {
} }
...@@ -279,7 +279,8 @@ private: ...@@ -279,7 +279,8 @@ private:
#error "libGLES_CM::loadExports unimplemented for this platform" #error "libGLES_CM::loadExports unimplemented for this platform"
#endif #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) if(libGLES_CM)
{ {
...@@ -293,7 +294,6 @@ private: ...@@ -293,7 +294,6 @@ private:
void *libGLES_CM = nullptr; void *libGLES_CM = nullptr;
LibGLES_CMexports *libGLES_CMexports = nullptr; LibGLES_CMexports *libGLES_CMexports = nullptr;
const std::string libraryDirectory;
}; };
#endif // libGLES_CM_hpp #endif // libGLES_CM_hpp
...@@ -1610,4 +1610,4 @@ extern "C" GL_API LibGLES_CMexports *libGLES_CM_swiftshader() ...@@ -1610,4 +1610,4 @@ extern "C" GL_API LibGLES_CMexports *libGLES_CM_swiftshader()
return &libGLES_CM; return &libGLES_CM;
} }
LibEGL libEGL(getLibraryDirectoryFromSymbol((void*)libGLES_CM_swiftshader)); LibEGL libEGL;
...@@ -1426,5 +1426,5 @@ extern "C" GL_APICALL LibGLESv2exports *libGLESv2_swiftshader() ...@@ -1426,5 +1426,5 @@ extern "C" GL_APICALL LibGLESv2exports *libGLESv2_swiftshader()
return &libGLESv2; return &libGLESv2;
} }
LibEGL libEGL(getLibraryDirectoryFromSymbol((void*)libGLESv2_swiftshader)); LibEGL libEGL;
LibGLES_CM libGLES_CM(getLibraryDirectoryFromSymbol((void*)libGLESv2_swiftshader)); LibGLES_CM libGLES_CM;
...@@ -254,7 +254,7 @@ public: ...@@ -254,7 +254,7 @@ public:
class LibGLESv2 class LibGLESv2
{ {
public: public:
LibGLESv2(const std::string libraryDirectory) : libraryDirectory(libraryDirectory) LibGLESv2()
{ {
} }
...@@ -304,7 +304,8 @@ private: ...@@ -304,7 +304,8 @@ private:
#error "libGLESv2::loadExports unimplemented for this platform" #error "libGLESv2::loadExports unimplemented for this platform"
#endif #endif
libGLESv2 = loadLibrary(libraryDirectory, libGLESv2_lib, "libGLESv2_swiftshader"); std::string directory = getModuleDirectory();
libGLESv2 = loadLibrary(directory, libGLESv2_lib, "libGLESv2_swiftshader");
if(libGLESv2) if(libGLESv2)
{ {
...@@ -318,7 +319,6 @@ private: ...@@ -318,7 +319,6 @@ private:
void *libGLESv2 = nullptr; void *libGLESv2 = nullptr;
LibGLESv2exports *libGLESv2exports = nullptr; LibGLESv2exports *libGLESv2exports = nullptr;
const std::string libraryDirectory;
}; };
#endif // libGLESv2_hpp #endif // libGLESv2_hpp
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment