Our wrapper library intercepts calls to dlopen "libGL.so" and returns
a handle to itself. That's correct, and as intended.
Before doing this, however, it's essential to actual dlopen "libGL.so"
for real even though we won't be returning a handle to it. This
ensures that any side effects from that dlopen are taken care of.
This fixes a bug where "fips apitrace replay foo.trace" would cause
Mesa to fail to load its driver as follows (with LIBGL_DEBUG=verbose):
libGL: OpenDriver: trying .../lib/dri/i965_dri.so
libGL error: dlopen .../lib/dri/i965_dri.so failed (.../lib/libdricore9.2.0.so.1: undefined symbol: _glapi_tls_Context)
dlopen (const char *filename, int flag)
{
Dl_info info;
dlopen (const char *filename, int flag)
{
Dl_info info;
+ void *ret;
+
+ /* Before deciding whether to redirect this dlopen to our own
+ * library, we call the real dlopen. This assures that any
+ * expected side-effects from loading the intended library are
+ * resolved. Below, we may still return a handle pointing to
+ * our own library, and not what is opened here. */
+ ret = dlwrap_real_dlopen (filename, flag);
/* Not libGL, so just return real dlopen */
if (STRNCMP_LITERAL (filename, "libGL.so"))
/* Not libGL, so just return real dlopen */
if (STRNCMP_LITERAL (filename, "libGL.so"))
- return dlwrap_real_dlopen (filename, flag);
/* Otherwise, for all libGL lookups we redirectl dlopens to
* our own library. If we've resolved libfips_handle before,
/* Otherwise, for all libGL lookups we redirectl dlopens to
* our own library. If we've resolved libfips_handle before,