Only load a dependent library when it has an expected symbol.

Bug 18752589

Change-Id: Ic42be261dc101810e6363c4823620d6c827c7975
Reviewed-on: https://swiftshader-review.googlesource.com/2880
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/Common/SharedLibrary.hpp b/src/Common/SharedLibrary.hpp
index bcddce7..31e6036 100644
--- a/src/Common/SharedLibrary.hpp
+++ b/src/Common/SharedLibrary.hpp
@@ -19,10 +19,12 @@
 #endif

 

 void *getLibraryHandle(const char *path);

-void *loadLibrary(const char *path);

+void *loadLibrary(const char *path);
+void freeLibrary(void *library);
+void *getProcAddress(void *library, const char *name);

 

 template<int n>

-void *loadLibrary(const char *(&names)[n])

+void *loadLibrary(const char *(&names)[n], const char *mustContainSymbol = nullptr)

 {

 	for(int i = 0; i < n; i++)

 	{

@@ -30,7 +32,12 @@
 

 		if(library)

 		{

-			return library;

+			if(!mustContainSymbol || getProcAddress(library, mustContainSymbol))

+			{

+				return library;

+			}

+

+			freeLibrary(library);

 		}

 	}

 

@@ -40,7 +47,12 @@
 

 		if(library)

 		{

-			return library;

+			if(!mustContainSymbol || getProcAddress(library, mustContainSymbol))

+			{

+				return library;

+			}

+

+			freeLibrary(library);

 		}

 	}

 

diff --git a/src/OpenGL/libEGL/Android.mk b/src/OpenGL/libEGL/Android.mk
index 2afc636..b50d145 100644
--- a/src/OpenGL/libEGL/Android.mk
+++ b/src/OpenGL/libEGL/Android.mk
@@ -24,6 +24,7 @@
 #LOCAL_CFLAGS += -DANGLE_DISABLE_TRACE
 
 LOCAL_CFLAGS += -std=c++11
+LOCAL_CFLAGS += -fvisibility=protected
 
 # These changes tie the build to Cloud Android. Do something else
 # for other Android builds.
diff --git a/src/OpenGL/libEGL/exports.map b/src/OpenGL/libEGL/exports.map
index 6ab0b00..24e4fb7 100644
--- a/src/OpenGL/libEGL/exports.map
+++ b/src/OpenGL/libEGL/exports.map
@@ -42,7 +42,7 @@
     eglCreatePlatformWindowSurfaceEXT;

     eglCreatePlatformPixmapSurfaceEXT;

 

-	libEGLexports;

+	libEGL_swiftshader;

 

 local:

     *;

diff --git a/src/OpenGL/libEGL/libEGL.cbp b/src/OpenGL/libEGL/libEGL.cbp
index 2582c34..16c273f 100644
--- a/src/OpenGL/libEGL/libEGL.cbp
+++ b/src/OpenGL/libEGL/libEGL.cbp
@@ -100,6 +100,7 @@
 			<Add option="-Wall" />
 			<Add option="-std=c++11" />
 			<Add option="-fexceptions" />
+			<Add option="-fvisibility=protected" />
 			<Add directory="./../include/" />
 			<Add directory="./../" />
 			<Add directory="./../../" />
diff --git a/src/OpenGL/libEGL/libEGL.def b/src/OpenGL/libEGL/libEGL.def
index df088dd..325d241 100644
--- a/src/OpenGL/libEGL/libEGL.def
+++ b/src/OpenGL/libEGL/libEGL.def
@@ -42,4 +42,4 @@
     eglCreatePlatformWindowSurfaceEXT

     eglCreatePlatformPixmapSurfaceEXT

 

-	libEGLexports
\ No newline at end of file
+	libEGL_swiftshader
\ No newline at end of file
diff --git a/src/OpenGL/libEGL/libEGL.hpp b/src/OpenGL/libEGL/libEGL.hpp
index 2fd614d..f4916a3 100644
--- a/src/OpenGL/libEGL/libEGL.hpp
+++ b/src/OpenGL/libEGL/libEGL.hpp
@@ -89,12 +89,12 @@
 			const char *libEGL_lib[] = {"libEGL_translator.so", "libEGL.so.1", "libEGL.so"};
 			#endif
 
-			libEGL = loadLibrary(libEGL_lib);
+			libEGL = loadLibrary(libEGL_lib, "libEGL_swiftshader");
 
 			if(libEGL)
 			{
-				auto libEGLexportsProc = (LibEGLexports *(*)())getProcAddress(libEGL, "libEGLexports");
-				libEGLexports = libEGLexportsProc();
+				auto libEGL_swiftshader = (LibEGLexports *(*)())getProcAddress(libEGL, "libEGL_swiftshader");
+				libEGLexports = libEGL_swiftshader();
 			}
 		}
 
diff --git a/src/OpenGL/libEGL/main.cpp b/src/OpenGL/libEGL/main.cpp
index 04bfdd7..72ed6e7 100644
--- a/src/OpenGL/libEGL/main.cpp
+++ b/src/OpenGL/libEGL/main.cpp
@@ -363,7 +363,7 @@
 	this->clientGetCurrentDisplay = egl::getCurrentDisplay;

 }

 

-extern "C" LibEGLexports *libEGLexports()

+extern "C" LibEGLexports *libEGL_swiftshader()

 {

 	static LibEGLexports libEGL;

 	return &libEGL;

diff --git a/src/OpenGL/libGLES_CM/Android.mk b/src/OpenGL/libGLES_CM/Android.mk
index 203d67c..44d64e9 100644
--- a/src/OpenGL/libGLES_CM/Android.mk
+++ b/src/OpenGL/libGLES_CM/Android.mk
@@ -89,6 +89,7 @@
 LOCAL_CFLAGS += -DLOG_TAG=\"libGLES_CM_swiftshader\"
 LOCAL_CFLAGS += -fno-operator-names -msse2 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
 LOCAL_CFLAGS += -std=c++11
+LOCAL_CFLAGS += -fvisibility=protected
 
 # Android's make system also uses NDEBUG, so we need to set/unset it forcefully
 # Uncomment for ON:
diff --git a/src/OpenGL/libGLES_CM/exports.map b/src/OpenGL/libGLES_CM/exports.map
index 4f05484..ce32f01 100644
--- a/src/OpenGL/libGLES_CM/exports.map
+++ b/src/OpenGL/libGLES_CM/exports.map
@@ -1,5 +1,6 @@
 {
 global:
+	eglBindAPI;
 	eglBindTexImage;
     eglChooseConfig;
     eglCopyBuffers;
@@ -205,7 +206,7 @@
     glDrawTexfOES;
     glDrawTexfvOES;
 
-    libGLES_CMexports;
+    libGLES_CM_swiftshader;
 
 	Register;
 
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cbp b/src/OpenGL/libGLES_CM/libGLES_CM.cbp
index c0cbc51..f0769f6 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cbp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cbp
@@ -115,6 +115,7 @@
 			<Add option="-fexceptions" />
 			<Add option="-fno-operator-names" />
 			<Add option="-msse2" />
+			<Add option="-fvisibility=protected" />
 			<Add option="-D__STDC_LIMIT_MACROS" />
 			<Add option="-D__STDC_CONSTANT_MACROS" />
 			<Add directory="./../" />
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.def b/src/OpenGL/libGLES_CM/libGLES_CM.def
index 3efec4d..0864513 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.def
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.def
@@ -205,6 +205,6 @@
     glDrawTexfOES
     glDrawTexfvOES
 
-	libGLES_CMexports
+	libGLES_CM_swiftshader
 
 	Register
\ No newline at end of file
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.hpp b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
index dd2d23a..300140d 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.hpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
@@ -76,12 +76,12 @@
 			const char *libGLES_CM_lib[] = {"libGLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};
 			#endif
 
-			libGLES_CM = loadLibrary(libGLES_CM_lib);
+			libGLES_CM = loadLibrary(libGLES_CM_lib, "libGLES_CM_swiftshader");
 
 			if(libGLES_CM)
 			{
-				auto libGLES_CMexportsProc = (LibGLES_CMexports *(*)())getProcAddress(libGLES_CM, "libGLES_CMexports");
-				libGLES_CMexports = libGLES_CMexportsProc();
+				auto libGLES_CM_swiftshader = (LibGLES_CMexports *(*)())getProcAddress(libGLES_CM, "libGLES_CM_swiftshader");
+				libGLES_CMexports = libGLES_CM_swiftshader();
 			}
 		}
 
diff --git a/src/OpenGL/libGLES_CM/main.cpp b/src/OpenGL/libGLES_CM/main.cpp
index 0044dbf..7fdb015 100644
--- a/src/OpenGL/libGLES_CM/main.cpp
+++ b/src/OpenGL/libGLES_CM/main.cpp
@@ -157,7 +157,7 @@
 	this->glEGLImageTargetTexture2DOES = ::glEGLImageTargetTexture2DOES;

 }

 

-extern "C" LibGLES_CMexports *libGLES_CMexports()

+extern "C" LibGLES_CMexports *libGLES_CM_swiftshader()

 {

 	static LibGLES_CMexports libGLES_CM;

 	return &libGLES_CM;

diff --git a/src/OpenGL/libGLESv2/Android.mk b/src/OpenGL/libGLESv2/Android.mk
index c400f51..032e893 100644
--- a/src/OpenGL/libGLESv2/Android.mk
+++ b/src/OpenGL/libGLESv2/Android.mk
@@ -135,6 +135,7 @@
 
 LOCAL_CFLAGS += -fno-operator-names -msse2 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
 LOCAL_CFLAGS += -std=c++11
+LOCAL_CFLAGS += -fvisibility=protected
 
 LOCAL_SHARED_LIBRARIES += libdl liblog libcutils libhardware libui libutils \
     $(GCE_STLPORT_LIBS)
diff --git a/src/OpenGL/libGLESv2/exports.map b/src/OpenGL/libGLESv2/exports.map
index 4670a61..bb81c63 100644
--- a/src/OpenGL/libGLESv2/exports.map
+++ b/src/OpenGL/libGLESv2/exports.map
@@ -168,7 +168,7 @@
 	glEGLImageTargetTexture2DOES;
 	glEGLImageTargetRenderbufferStorageOES;
 
-    libGLESv2exports;
+    libGLESv2_swiftshader;
 
 	Register;
 
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cbp b/src/OpenGL/libGLESv2/libGLESv2.cbp
index 18b8ab6..8f33535 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cbp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cbp
@@ -115,6 +115,7 @@
 			<Add option="-fexceptions" />
 			<Add option="-fno-operator-names" />
 			<Add option="-msse2" />
+			<Add option="-fvisibility=protected" />
 			<Add option="-D__STDC_LIMIT_MACROS" />
 			<Add option="-D__STDC_CONSTANT_MACROS" />
 			<Add directory="./../" />
diff --git a/src/OpenGL/libGLESv2/libGLESv2.def b/src/OpenGL/libGLESv2/libGLESv2.def
index 0ce826c..9a7770b 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.def
+++ b/src/OpenGL/libGLESv2/libGLESv2.def
@@ -274,6 +274,6 @@
     glTexStorage3D                  @304
     glGetInternalformativ           @308
 
-    libGLESv2exports
+    libGLESv2_swiftshader
 
 	Register
\ No newline at end of file
diff --git a/src/OpenGL/libGLESv2/libGLESv2.hpp b/src/OpenGL/libGLESv2/libGLESv2.hpp
index 15f6528..00a1926 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.hpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.hpp
@@ -74,12 +74,12 @@
 			const char *libGLESv2_lib[] = {"libGLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};
 			#endif
 
-			libGLESv2 = loadLibrary(libGLESv2_lib);
+			libGLESv2 = loadLibrary(libGLESv2_lib, "libGLESv2_swiftshader");
 
 			if(libGLESv2)
 			{
-				auto libGLESv2exportsProc = (LibGLESv2exports *(*)())getProcAddress(libGLESv2, "libGLESv2exports");
-				libGLESv2exports = libGLESv2exportsProc();
+				auto libGLESv2_swiftshader = (LibGLESv2exports *(*)())getProcAddress(libGLESv2, "libGLESv2_swiftshader");
+				libGLESv2exports = libGLESv2_swiftshader();
 			}
 		}
 
diff --git a/src/OpenGL/libGLESv2/main.cpp b/src/OpenGL/libGLESv2/main.cpp
index d77b784..9094333 100644
--- a/src/OpenGL/libGLESv2/main.cpp
+++ b/src/OpenGL/libGLESv2/main.cpp
@@ -165,7 +165,7 @@
 	this->createFrameBuffer = ::createFrameBuffer;

 }

 

-extern "C" LibGLESv2exports *libGLESv2exports()

+extern "C" LibGLESv2exports *libGLESv2_swiftshader()

 {

 	static LibGLESv2exports libGLESv2;

 	return &libGLESv2;