X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=cgltrace.py;h=92626f3a19620e039ffe46863c6a028b6acbc5ad;hb=99f84fa0e278f4ca30577c22ede85c643c6017cc;hp=33765f9b8d3b1ebfae3e81656c994e6434cc3cac;hpb=4364860d389bf273bcfce9c5286cc7a3642469c9;p=apitrace diff --git a/cgltrace.py b/cgltrace.py index 33765f9..92626f3 100644 --- a/cgltrace.py +++ b/cgltrace.py @@ -44,13 +44,14 @@ if __name__ == '__main__': print print '#include ' print '#include ' + print '#include ' print print '#ifndef _GNU_SOURCE' print '#define _GNU_SOURCE // for dladdr' print '#endif' print '#include ' print - print '#include "trace_write.hpp"' + print '#include "trace_writer.hpp"' print print '// To validate our prototypes' print '#define GL_GLEXT_PROTOTYPES' @@ -69,7 +70,13 @@ if __name__ == '__main__': /* - * Handle to the true libGL.so + * Path to the true OpenGL framework + */ +static const char *libgl_filename = "/System/Library/Frameworks/OpenGL.framework/OpenGL"; + + +/* + * Handle to the true OpenGL framework. */ static void *libgl_handle = NULL; @@ -77,22 +84,30 @@ static void *libgl_handle = NULL; /* * Lookup a libGL symbol */ -static void * __dlsym(const char *symbol) +void * __libgl_sym(const char *symbol) { void *result; - if (!libgl_handle) { - const char * libgl_filename; + if (!libgl_handle) { /* - * Unfortunately we can't just dlopen - * /System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib - * because DYLD_LIBRARY_PATH takes precedence, even for absolute paths. + * Unfortunately we can't just dlopen the true dynamic library because + * DYLD_LIBRARY_PATH/DYLD_FRAMEWORK_PATH take precedence, even for + * absolute paths. So we create a temporary symlink, and dlopen that + * instead. */ - libgl_filename = "libGL.system.dylib"; - libgl_handle = dlopen(libgl_filename, RTLD_LOCAL | RTLD_NOW | RTLD_FIRST); + char temp_filename[] = "/tmp/tmp.XXXXXX"; + + if (mktemp(temp_filename) != NULL) { + if (symlink(libgl_filename, temp_filename) == 0) { + libgl_handle = dlopen(temp_filename, RTLD_LOCAL | RTLD_NOW | RTLD_FIRST); + remove(temp_filename); + } + } + if (!libgl_handle) { - OS::DebugMessage("error: couldn't load %s\n", libgl_filename); + OS::DebugMessage("apitrace: error: couldn't load %s\n", libgl_filename); + OS::Abort(); return NULL; } } @@ -100,7 +115,7 @@ static void * __dlsym(const char *symbol) result = dlsym(libgl_handle, symbol); if (result == dlsym(RTLD_SELF, symbol)) { - OS::DebugMessage("error: symbol lookup recursion\n"); + OS::DebugMessage("apitrace: error: symbol lookup recursion\n"); OS::Abort(); return NULL; }