Try resolving existing X11 symbols before loading libX11.
libX11 may have already been loaded (dynamically or statically) by the
application. Attempting to load it again could result in a different
version being loaded, causing various compatibility issues.
Bug b/32880157
Change-Id: Ica8e6b1c85b82469885a20dcef31e25e6b598132
Reviewed-on: https://swiftshader-review.googlesource.com/8348
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Main/libX11.cpp b/src/Main/libX11.cpp
index 7739e4a..9c056bf 100644
--- a/src/Main/libX11.cpp
+++ b/src/Main/libX11.cpp
@@ -56,21 +56,24 @@
if(!libX11)
{
- libX11 = loadLibrary("libX11.so");
-
- if(libX11)
+ if(getProcAddress(RTLD_DEFAULT, "XOpenDisplay")) // Search the global scope for pre-loaded X11 library.
{
- libXext = loadLibrary("libXext.so");
- libX11exports = new LibX11exports(libX11, libXext);
+ libX11exports = new LibX11exports(RTLD_DEFAULT, RTLD_DEFAULT);
+ libX11 = (void*)-1; // No need to load it.
}
- else // Might have failed to load due to sandboxing. Search the global scope for pre-loaded library.
+ else
{
- if(getProcAddress(RTLD_DEFAULT, "XOpenDisplay"))
- {
- libX11exports = new LibX11exports(RTLD_DEFAULT, RTLD_DEFAULT);
- }
+ libX11 = loadLibrary("libX11.so");
- libX11 = (void*)-1; // Don't attempt loading more than once.
+ if(libX11)
+ {
+ libXext = loadLibrary("libXext.so");
+ libX11exports = new LibX11exports(libX11, libXext);
+ }
+ else
+ {
+ libX11 = (void*)-1; // Don't attempt loading more than once.
+ }
}
}