]> git.cworth.org Git - apitrace/commitdiff
Compensate for the lack of LD_PRELOAD support on ANDROID
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Mon, 12 Mar 2012 20:46:53 +0000 (20:46 +0000)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 17 Mar 2012 12:38:00 +0000 (12:38 +0000)
Untested.

egltrace.py
glproc_egl.cpp

index 1787c0b3e2989b865a2d971e026f67d61e6b94b1..5d5c7593a9f51b8663b901e9fe969786d7fa2115 100644 (file)
@@ -113,6 +113,12 @@ if __name__ == '__main__':
     print r'''
 
 
+/*
+ * Android does not support LD_PRELOAD.
+ */
+#if !defined(ANDROID)
+
+
 /*
  * Invoke the true dlopen() function.
  */
@@ -186,5 +192,8 @@ void * dlopen(const char *filename, int flag)
 }
 
 
+#endif /* !ANDROID */
+
+
 
 '''
index ec167a7f0b6caf037f05a2b77cc919f9e5257202..53dd7145ecd5b39dfa03c6e416a74cdc6ed9fda9 100644 (file)
@@ -73,7 +73,33 @@ void *__libGlHandle = NULL;
 void *
 __getPublicProcAddress(const char *procName)
 {
+#if defined(ANDROID)
+    /*
+     * Android does not support LD_PRELOAD.  It is assumed that applications
+     * are explicitely loading egltrace.so.
+     */
+    void *lib = NULL;
+    if (procName[0] == 'e' && procName[1] == 'g' && procName[2] == 'l') {
+        static void *libEGL = NULL;
+        if (!libEGL) {
+            libEGL = dlopen("libEGL.so", RTLD_LOCAL | RTLD_LAZY);
+        }
+        lib = libEGL;
+    } else if (procName[0] == 'g' && procName[1] == 'l') {
+        /* TODO: Support libGLESv1_CM.so too somehow. */
+        static void *libGLESv2 = NULL;
+        if (!libGLESv2) {
+            libGLESv2 = dlopen("libGLESv2.so", RTLD_LOCAL | RTLD_LAZY);
+        }
+        lib = libGLESv2;
+    }
+    if (lib) {
+        return dlsym(lib, procName);
+    }
+    return NULL;
+#else
     return dlsym(RTLD_NEXT, procName);
+#endif
 }
 
 /*