From dce95078ece1a3a08c290ddc6191cb92e15542d5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Mon, 12 Mar 2012 20:46:53 +0000 Subject: [PATCH] Compensate for the lack of LD_PRELOAD support on ANDROID Untested. --- egltrace.py | 9 +++++++++ glproc_egl.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/egltrace.py b/egltrace.py index 1787c0b..5d5c759 100644 --- a/egltrace.py +++ b/egltrace.py @@ -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 */ + + ''' diff --git a/glproc_egl.cpp b/glproc_egl.cpp index ec167a7..53dd714 100644 --- a/glproc_egl.cpp +++ b/glproc_egl.cpp @@ -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 } /* -- 2.45.2