X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glwrap.c;h=0ae295a87082212b59d764f8b89250c2ab5c68b8;hb=d6ac766abe401b681282cdcf273e7fb67fff99bd;hp=a7d62c5c1ef2be57d650591302923197c0fbb05f;hpb=fac9c8c2d3bfc5e97f2fdcf90f8cbe3ac9b2c49e;p=fips diff --git a/glwrap.c b/glwrap.c index a7d62c5..0ae295a 100644 --- a/glwrap.c +++ b/glwrap.c @@ -19,6 +19,8 @@ * THE SOFTWARE. */ +#include "dlwrap.h" + /* The prototypes for some OpenGL functions changed at one point from: * * const void* *indices @@ -45,26 +47,48 @@ #include "metrics.h" -#include "dlwrap.h" - static int inside_new_list = 0; +static void *gl_handle; + +void +glwrap_set_gl_handle (void *handle) +{ + if (gl_handle == NULL) + gl_handle = handle; +} + void * glwrap_lookup (char *name) { - const char *libgl_filename = "libGL.so.1"; - static void *libgl_handle = NULL; - - if (! libgl_handle) { - libgl_handle = dlwrap_real_dlopen (libgl_filename, RTLD_NOW | RTLD_DEEPBIND); - if (! libgl_handle) { - fprintf (stderr, "Error: Failed to dlopen %s\n", - libgl_filename); - exit (1); - } + void *ret; + + /* We don't call dlopen here to find the library in which to + * perform a dlsym lookup. That's because the application may + * be loading libGL.so or libGLESv2.so for its OpenGL symbols. + * + * So we instead watch for one of those filenames to go by in + * our dlopen wrapper, which will then call + * glwrap_set_gl_handle to give us the handle to use here. + * + + * If the application hasn't called dlopen on a "libGL" + * library, then presumably the application is linked directly + * to an OpenGL implementation. In this case, we can use + * RTLD_NEXT to find the symbol. + */ + if (gl_handle == NULL) + gl_handle = RTLD_NEXT; + + ret = dlwrap_real_dlsym (gl_handle, name); + + if (ret == NULL) { + fprintf (stderr, "Error: glwrap_lookup failed to dlsym %s\n", + name); + exit (1); } - return dlwrap_real_dlsym (libgl_handle, name); + return ret; } /* Execute an OpenGL call and time it with a GPU metrics counter. */