OSDN Git Service

Only load a dependent library when it has an expected symbol.
authorNicolas Capens <capn@google.com>
Fri, 17 Apr 2015 16:40:04 +0000 (12:40 -0400)
committerNicolas Capens <capn@google.com>
Fri, 17 Apr 2015 16:43:18 +0000 (16:43 +0000)
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>
19 files changed:
src/Common/SharedLibrary.hpp
src/OpenGL/libEGL/Android.mk
src/OpenGL/libEGL/exports.map
src/OpenGL/libEGL/libEGL.cbp
src/OpenGL/libEGL/libEGL.def
src/OpenGL/libEGL/libEGL.hpp
src/OpenGL/libEGL/main.cpp
src/OpenGL/libGLES_CM/Android.mk
src/OpenGL/libGLES_CM/exports.map
src/OpenGL/libGLES_CM/libGLES_CM.cbp
src/OpenGL/libGLES_CM/libGLES_CM.def
src/OpenGL/libGLES_CM/libGLES_CM.hpp
src/OpenGL/libGLES_CM/main.cpp
src/OpenGL/libGLESv2/Android.mk
src/OpenGL/libGLESv2/exports.map
src/OpenGL/libGLESv2/libGLESv2.cbp
src/OpenGL/libGLESv2/libGLESv2.def
src/OpenGL/libGLESv2/libGLESv2.hpp
src/OpenGL/libGLESv2/main.cpp

index bcddce7..31e6036 100644 (file)
 #endif\r
 \r
 void *getLibraryHandle(const char *path);\r
-void *loadLibrary(const char *path);\r
+void *loadLibrary(const char *path);
+void freeLibrary(void *library);
+void *getProcAddress(void *library, const char *name);\r
 \r
 template<int n>\r
-void *loadLibrary(const char *(&names)[n])\r
+void *loadLibrary(const char *(&names)[n], const char *mustContainSymbol = nullptr)\r
 {\r
        for(int i = 0; i < n; i++)\r
        {\r
@@ -30,7 +32,12 @@ void *loadLibrary(const char *(&names)[n])
 \r
                if(library)\r
                {\r
-                       return library;\r
+                       if(!mustContainSymbol || getProcAddress(library, mustContainSymbol))\r
+                       {\r
+                               return library;\r
+                       }\r
+\r
+                       freeLibrary(library);\r
                }\r
        }\r
 \r
@@ -40,7 +47,12 @@ void *loadLibrary(const char *(&names)[n])
 \r
                if(library)\r
                {\r
-                       return library;\r
+                       if(!mustContainSymbol || getProcAddress(library, mustContainSymbol))\r
+                       {\r
+                               return library;\r
+                       }\r
+\r
+                       freeLibrary(library);\r
                }\r
        }\r
 \r
index 2afc636..b50d145 100644 (file)
@@ -24,6 +24,7 @@ LOCAL_CFLAGS += -UNDEBUG -g
 #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.
index 6ab0b00..24e4fb7 100644 (file)
@@ -42,7 +42,7 @@ global:
     eglCreatePlatformWindowSurfaceEXT;\r
     eglCreatePlatformPixmapSurfaceEXT;\r
 \r
-       libEGLexports;\r
+       libEGL_swiftshader;\r
 \r
 local:\r
     *;\r
index 2582c34..16c273f 100644 (file)
                        <Add option="-Wall" />
                        <Add option="-std=c++11" />
                        <Add option="-fexceptions" />
+                       <Add option="-fvisibility=protected" />
                        <Add directory="./../include/" />
                        <Add directory="./../" />
                        <Add directory="./../../" />
index df088dd..325d241 100644 (file)
@@ -42,4 +42,4 @@ EXPORTS
     eglCreatePlatformWindowSurfaceEXT\r
     eglCreatePlatformPixmapSurfaceEXT\r
 \r
-       libEGLexports
\ No newline at end of file
+       libEGL_swiftshader
\ No newline at end of file
index 2fd614d..f4916a3 100644 (file)
@@ -89,12 +89,12 @@ private:
                        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();
                        }
                }
 
index 04bfdd7..72ed6e7 100644 (file)
@@ -363,7 +363,7 @@ LibEGLexports::LibEGLexports()
        this->clientGetCurrentDisplay = egl::getCurrentDisplay;\r
 }\r
 \r
-extern "C" LibEGLexports *libEGLexports()\r
+extern "C" LibEGLexports *libEGL_swiftshader()\r
 {\r
        static LibEGLexports libEGL;\r
        return &libEGL;\r
index 203d67c..44d64e9 100644 (file)
@@ -89,6 +89,7 @@ LOCAL_SRC_FILES += \
 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:
index 4f05484..ce32f01 100644 (file)
@@ -1,5 +1,6 @@
 {
 global:
+       eglBindAPI;
        eglBindTexImage;
     eglChooseConfig;
     eglCopyBuffers;
@@ -205,7 +206,7 @@ global:
     glDrawTexfOES;
     glDrawTexfvOES;
 
-    libGLES_CMexports;
+    libGLES_CM_swiftshader;
 
        Register;
 
index c0cbc51..f0769f6 100644 (file)
                        <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="./../" />
index 3efec4d..0864513 100644 (file)
@@ -205,6 +205,6 @@ EXPORTS
     glDrawTexfOES
     glDrawTexfvOES
 
-       libGLES_CMexports
+       libGLES_CM_swiftshader
 
        Register
\ No newline at end of file
index dd2d23a..300140d 100644 (file)
@@ -76,12 +76,12 @@ private:
                        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();
                        }
                }
 
index 0044dbf..7fdb015 100644 (file)
@@ -157,7 +157,7 @@ LibGLES_CMexports::LibGLES_CMexports()
        this->glEGLImageTargetTexture2DOES = ::glEGLImageTargetTexture2DOES;\r
 }\r
 \r
-extern "C" LibGLES_CMexports *libGLES_CMexports()\r
+extern "C" LibGLES_CMexports *libGLES_CM_swiftshader()\r
 {\r
        static LibGLES_CMexports libGLES_CM;\r
        return &libGLES_CM;\r
index c400f51..032e893 100644 (file)
@@ -135,6 +135,7 @@ LOCAL_CFLAGS += -UNDEBUG -g
 
 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)
index 4670a61..bb81c63 100644 (file)
@@ -168,7 +168,7 @@ global:
        glEGLImageTargetTexture2DOES;
        glEGLImageTargetRenderbufferStorageOES;
 
-    libGLESv2exports;
+    libGLESv2_swiftshader;
 
        Register;
 
index 18b8ab6..8f33535 100644 (file)
                        <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="./../" />
index 0ce826c..9a7770b 100644 (file)
@@ -274,6 +274,6 @@ EXPORTS
     glTexStorage3D                  @304
     glGetInternalformativ           @308
 
-    libGLESv2exports
+    libGLESv2_swiftshader
 
        Register
\ No newline at end of file
index 15f6528..00a1926 100644 (file)
@@ -74,12 +74,12 @@ private:
                        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();
                        }
                }
 
index d77b784..9094333 100644 (file)
@@ -165,7 +165,7 @@ LibGLESv2exports::LibGLESv2exports()
        this->createFrameBuffer = ::createFrameBuffer;\r
 }\r
 \r
-extern "C" LibGLESv2exports *libGLESv2exports()\r
+extern "C" LibGLESv2exports *libGLESv2_swiftshader()\r
 {\r
        static LibGLESv2exports libGLESv2;\r
        return &libGLESv2;\r