From: Carl Worth Date: Mon, 29 Jul 2013 21:25:55 +0000 (-0700) Subject: Add GLAZE_WRAPPER variable to specify library with OpenGL wrapper functions X-Git-Url: https://git.cworth.org/git?p=glaze;a=commitdiff_plain;h=adf4faac47e4136b879913b6ae9e2018de64af93 Add GLAZE_WRAPPER variable to specify library with OpenGL wrapper functions The GLAZE_WRAPPER environment variable should point to a library which has symbols for some subset of the OpenGL API. For all such symbols, Glaze will resolve its ifunc symbols to the wrapper functions. For all functions not having symbols in the GLAZE_WRAPPER library, Glaze will resolve its ifunc symbols to the functions in the GLAZE_LIBGL library. --- diff --git a/glaze.c b/glaze.c index af2aade..0c2eada 100644 --- a/glaze.c +++ b/glaze.c @@ -26,6 +26,7 @@ #include void *libgl_handle; +void *wrapper_handle; static void open_libgl_handle (void) @@ -48,6 +49,27 @@ open_libgl_handle (void) } } +static void +open_wrapper_handle (void) +{ + const char *path; + + if (wrapper_handle) + return; + + path = getenv ("GLAZE_WRAPPER"); + if (path == NULL) { + fprintf (stderr, "GLAZE_WRAPPER unset. Please set to path of real libGL.so under glaze.\n"); + exit (1); + } + + wrapper_handle = dlopen (path, RTLD_LAZY); + if (wrapper_handle == NULL) { + fprintf (stderr, "Error: Failed to dlopen %s\n", path); + exit (1); + } +} + static void glaze_init (void) __attribute__((constructor)); @@ -55,11 +77,19 @@ static void glaze_init (void) { open_libgl_handle (); + open_wrapper_handle (); } static void * resolve (const char *name) { + void *symbol; + + /* The wrapper gets first choice on all symbols. */ + symbol = dlsym (wrapper_handle, name); + if (symbol) + return symbol; + return dlsym (libgl_handle, name); }