On Wed, Apr 24, 2013 at 09:40:44PM +0200, Mathias Fröhlich wrote: > > Hi Tom, > > On Tuesday, April 23, 2013 20:47:24 Tom Stellard wrote: > > First of all, thanks for investigating this. The information you've > > provided has helped me a lot. > Good to hear that it helps. > > > I took a shot at implementing it this way with private static copies of > > llvm. I've pushed the initial work to this branch: > > git://people.freedesktop.org/~tstellar/mesa llvm-build > > > > I was able to hide the LLVM symbols by using the --exclude-libs linker > > flag and so far I've tested with glxgears, an opencl example and also > > eglgears and they all work. I still need to do some more testing, but > > any thoughts on what I've done so far in this branch? > > I will look at this as soon as I find time. Probably not before the beginning > of next week. >
I've thought about this some more, and I think that the best solution might be to move all LLVM API calls into gallivm and build it as a shared object with it's own private copy of LLVM statically linked. This way we would still have a private copy of LLVM to work with, but without having to statically link every single gallium target with LLVM. Any thoughts about this? > For now, I have attached the patch series I mentioned regarding dlopen flags > which could be an other approach for this. I don't mind which approach you > really take in the end. Anyway this appears to work up to now. It would have > the advantage that it also helps other drivers beside r600g with the llvm > issues and it would help much further for all the non static private symbols > we have in the drivers. The series is running here in my private tree since > about half a year. > A few questions about the RTL_DEEPBIND patches: 1. Does this only work for linux? 2. Does RTL_DEEPBIND only make a difference if we are statically linking to LLVM? > I have also done a testcase in piglit that shows the current problem with > r600g and llvm. To be really general we should put an other symbol there > instead of the llvm context initializer. But as a first test case you can > work > with, this should be sufficient. That one really fails with current > r600g/llvm > and works with the dlopen patch series. Consequently if you want to make sure > your branch works on a private llvm version, this test needs to pass also. > This testcase is great, thanks. -Tom > Feel free to take and improove the provided patches. > > Greetings > > Mathias > From 757a111221774703d558b5807e7465a026d6a3f8 Mon Sep 17 00:00:00 2001 > Message-Id: > <757a111221774703d558b5807e7465a026d6a3f8.1366832004.git.mathias.froehl...@gmx.net> > From: Mathias Froehlich <mathias.froehl...@web.de> > Date: Wed, 24 Apr 2013 09:35:17 +0200 > Subject: [PATCH] Add test for driver private symbol isolation. > > --- > tests/general/CMakeLists.gl.txt | 5 ++++ > tests/general/driver-isolation-library.c | 36 ++++++++++++++++++++++ > tests/general/driver-isolation.c | 51 > ++++++++++++++++++++++++++++++++ > 3 files changed, 92 insertions(+) > create mode 100644 tests/general/driver-isolation-library.c > create mode 100644 tests/general/driver-isolation.c > > diff --git a/tests/general/CMakeLists.gl.txt b/tests/general/CMakeLists.gl.txt > index 0e87baa..6beb745 100644 > --- a/tests/general/CMakeLists.gl.txt > +++ b/tests/general/CMakeLists.gl.txt > @@ -81,6 +81,11 @@ piglit_add_executable (line-aa-width line-aa-width.c) > IF (UNIX) > target_link_libraries (line-aa-width m) > ENDIF (UNIX) > +IF (UNIX) > + add_library (driver-isolation-library SHARED driver-isolation-library.c) > + piglit_add_executable (driver-isolation driver-isolation.c) > + target_link_libraries (driver-isolation driver-isolation-library) > +ENDIF (UNIX) > piglit_add_executable (longprim longprim.c) > piglit_add_executable (masked-clear masked-clear.c) > piglit_add_executable (pos-array pos-array.c) > diff --git a/tests/general/driver-isolation-library.c > b/tests/general/driver-isolation-library.c > new file mode 100644 > index 0000000..ef307a3 > --- /dev/null > +++ b/tests/general/driver-isolation-library.c > @@ -0,0 +1,36 @@ > +/* > + * Copyright (c) 2013 Mathias Fröhlich. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * on the rights to use, copy, modify, merge, publish, distribute, sub > + * license, and/or sell copies of the Software, and to permit persons to whom > + * the Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND > + * NON-INFRINGEMENT. IN NO EVENT SHALL VMWARE AND/OR THEIR SUPPLIERS > + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN > + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN > + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE > + * SOFTWARE. > + */ > + > +void > +my_important_function() > +{ > +} > + > +void* > +LLVMContextCreate() > +{ > + /* If we really get here, symbol isolation does not work. > + */ > + exit(-1); > +} > diff --git a/tests/general/driver-isolation.c > b/tests/general/driver-isolation.c > new file mode 100644 > index 0000000..ee81202 > --- /dev/null > +++ b/tests/general/driver-isolation.c > @@ -0,0 +1,51 @@ > +/* > + * Copyright (c) 2013 Mathias Fröhlich. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * on the rights to use, copy, modify, merge, publish, distribute, sub > + * license, and/or sell copies of the Software, and to permit persons to whom > + * the Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND > + * NON-INFRINGEMENT. IN NO EVENT SHALL VMWARE AND/OR THEIR SUPPLIERS > + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN > + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN > + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE > + * SOFTWARE. > + */ > + > +/* Test that the drivers internal symbols cannot conflict with any > + * application provided symbol of the same name. > + */ > + > +#include "piglit-util-gl-common.h" > + > +PIGLIT_GL_TEST_CONFIG_BEGIN > + > + config.supports_gl_compat_version = 10; > + > + config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE; > + > +PIGLIT_GL_TEST_CONFIG_END > + > +extern void my_important_function(); > + > +enum piglit_result > +piglit_display(void) > +{ > + return PIGLIT_PASS; > +} > + > +void > +piglit_init(int argc, char **argv) > +{ > + my_important_function(); > +} > -- > 1.8.1.4 > > From c43a2ae15fe3adaa764175d076d07895351834f6 Mon Sep 17 00:00:00 2001 > Message-Id: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <mathias.froehl...@gmx.net> > Date: Sun, 20 Jan 2013 09:45:27 +0100 > Subject: [PATCH 1/8] glx/dri: Use RTLD_LOCAL | RTLD_DEEPBIND instead of > RTLD_GLOBAL. > > To avoid symbol collisions due to the increasing use of shared > linking, which in turn requires some more symbols to be visible, > load drivers without pushing their symbols into the global > namespace. > > Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> > --- > src/glx/dri_common.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c > index 1bf20ec..d762b43 100644 > --- a/src/glx/dri_common.c > +++ b/src/glx/dri_common.c > @@ -47,6 +47,9 @@ > #ifndef RTLD_GLOBAL > #define RTLD_GLOBAL 0 > #endif > +#ifndef RTLD_DEEPBIND > +#define RTLD_DEEPBIND 0 > +#endif > > /** > * Print informational message to stderr if LIBGL_DEBUG is set to > @@ -162,14 +165,18 @@ driOpenDriver(const char *driverName) > snprintf(realDriverName, sizeof realDriverName, > "%.*s/tls/%s_dri.so", len, p, driverName); > InfoMessageF("OpenDriver: trying %s\n", realDriverName); > - handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL); > + /* The driver and everything in there should be invisible to > + anybody else. Therefore the RTLD_LOCAL | RTLD_DEEPBIND */ > + handle = dlopen(realDriverName, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND); > #endif > > if (handle == NULL) { > snprintf(realDriverName, sizeof realDriverName, > "%.*s/%s_dri.so", len, p, driverName); > InfoMessageF("OpenDriver: trying %s\n", realDriverName); > - handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL); > + /* The driver and everything in there should be invisible to > + anybody else. Therefore the RTLD_LOCAL | RTLD_DEEPBIND */ > + handle = dlopen(realDriverName, RTLD_NOW | RTLD_LOCAL | > RTLD_DEEPBIND); > } > > if (handle != NULL) > -- > 1.8.1.4 > > From 1708d90af8665d93d6d07b5d200e5a54cfd1ab2b Mon Sep 17 00:00:00 2001 > Message-Id: > <1708d90af8665d93d6d07b5d200e5a54cfd1ab2b.1366832037.git.mathias.froehl...@gmx.net> > In-Reply-To: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > References: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <mathias.froehl...@gmx.net> > Date: Sun, 20 Jan 2013 09:45:27 +0100 > Subject: [PATCH 2/8] egl/dri2: Use RTLD_LOCAL | RTLD_DEEPBIND instead of > RTLD_GLOBAL. > > To avoid symbol collisions due to the increasing use of shared > linking, which in turn requires some more symbols to be visible, > load drivers without pushing their symbols into the global > namespace. > > Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> > --- > src/egl/drivers/dri2/egl_dri2.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c > index 1011f27..bfa71df 100644 > --- a/src/egl/drivers/dri2/egl_dri2.c > +++ b/src/egl/drivers/dri2/egl_dri2.c > @@ -41,6 +41,10 @@ > > #include "egl_dri2.h" > > +#ifndef RTLD_DEEPBIND > +#define RTLD_DEEPBIND 0 > +#endif > + > const __DRIuseInvalidateExtension use_invalidate = { > { __DRI_USE_INVALIDATE, 1 } > }; > @@ -395,12 +399,16 @@ dri2_open_driver(_EGLDisplay *disp) > #if GLX_USE_TLS > snprintf(path, sizeof path, > "%.*s/tls/%s_dri.so", len, p, dri2_dpy->driver_name); > - dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL); > + /* The driver and everything in there should be invisible to > + anybody else. Therefore the RTLD_LOCAL | RTLD_DEEPBIND */ > + dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND); > #endif > if (dri2_dpy->driver == NULL) { > snprintf(path, sizeof path, > "%.*s/%s_dri.so", len, p, dri2_dpy->driver_name); > - dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL); > + /* The driver and everything in there should be invisible to > + anybody else. Therefore the RTLD_LOCAL | RTLD_DEEPBIND */ > + dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND); > if (dri2_dpy->driver == NULL) > _eglLog(_EGL_DEBUG, "failed to open %s: %s\n", path, dlerror()); > } > -- > 1.8.1.4 > > From cc9ac8368de9ec95574fed44d807eb5004fe8e09 Mon Sep 17 00:00:00 2001 > Message-Id: > <cc9ac8368de9ec95574fed44d807eb5004fe8e09.1366832037.git.mathias.froehl...@gmx.net> > In-Reply-To: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > References: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <mathias.froehl...@gmx.net> > Date: Sun, 20 Jan 2013 09:45:27 +0100 > Subject: [PATCH 3/8] egl/driver: Use RTLD_DEEPBIND if available. > > Increase the symbol isolation level for the chain loaded > driver module. > > Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> > --- > src/egl/main/egldriver.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c > index ffdd146..396e6a4 100644 > --- a/src/egl/main/egldriver.c > +++ b/src/egl/main/egldriver.c > @@ -50,6 +50,11 @@ > #include <sys/types.h> > #include <dirent.h> > #include <unistd.h> > + > +#ifndef RTLD_DEEPBIND > +#define RTLD_DEEPBIND 0 > +#endif > + > #endif > > > @@ -115,7 +120,7 @@ typedef void * lib_handle; > static void * > open_library(const char *filename) > { > - return dlopen(filename, RTLD_LAZY); > + return dlopen(filename, RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND); > } > > static void > -- > 1.8.1.4 > > From 147ac5087664cd7a08b1c96edb2801e831f163bb Mon Sep 17 00:00:00 2001 > Message-Id: > <147ac5087664cd7a08b1c96edb2801e831f163bb.1366832037.git.mathias.froehl...@gmx.net> > In-Reply-To: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > References: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <mathias.froehl...@gmx.net> > Date: Sun, 20 Jan 2013 09:45:27 +0100 > Subject: [PATCH 4/8] gbm/dri: Use RTLD_LOCAL | RTLD_DEEPBIND instead of > RTLD_GLOBAL. > > To avoid symbol collisions due to the increasing use of shared > linking, which in turn requires some more symbols to be visible, > load drivers without pushing their symbols into the global > namespace. > > Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> > --- > src/gbm/backends/dri/gbm_dri.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c > index a3a0530..b1d15cb 100644 > --- a/src/gbm/backends/dri/gbm_dri.c > +++ b/src/gbm/backends/dri/gbm_dri.c > @@ -41,6 +41,10 @@ > #include <GL/gl.h> /* dri_interface needs GL types */ > #include <GL/internal/dri_interface.h> > > +#ifndef RTLD_DEEPBIND > +#define RTLD_DEEPBIND 0 > +#endif > + > #include "gbm_driint.h" > > #include "gbmint.h" > @@ -192,12 +196,16 @@ dri_load_driver(struct gbm_dri_device *dri) > #if GLX_USE_TLS > snprintf(path, sizeof path, > "%.*s/tls/%s_dri.so", len, p, dri->base.driver_name); > - dri->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL); > + /* The driver and everything in there should be invisible to > + anybody else. Therefore the RTLD_LOCAL | RTLD_DEEPBIND */ > + dri->driver = dlopen(path, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND); > #endif > if (dri->driver == NULL) { > snprintf(path, sizeof path, > "%.*s/%s_dri.so", len, p, dri->base.driver_name); > - dri->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL); > + /* The driver and everything in there should be invisible to > + anybody else. Therefore the RTLD_LOCAL | RTLD_DEEPBIND */ > + dri->driver = dlopen(path, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND); > if (dri->driver == NULL) > fprintf(stderr, "failed to open %s: %s\n", path, dlerror()); > } > -- > 1.8.1.4 > > From 42f6a2ea7499f169d39c1e65b9a32dd3e81a45a9 Mon Sep 17 00:00:00 2001 > Message-Id: > <42f6a2ea7499f169d39c1e65b9a32dd3e81a45a9.1366832037.git.mathias.froehl...@gmx.net> > In-Reply-To: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > References: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <mathias.froehl...@gmx.net> > Date: Sun, 20 Jan 2013 09:45:27 +0100 > Subject: [PATCH 6/8] mesa: Remove unused RTLD_* defines. > > Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> > --- > src/mesa/main/texcompress_s3tc.c | 2 -- > 1 file changed, 2 deletions(-) > > diff --git a/src/mesa/main/texcompress_s3tc.c > b/src/mesa/main/texcompress_s3tc.c > index 02f2c7c..9f8d00b 100644 > --- a/src/mesa/main/texcompress_s3tc.c > +++ b/src/mesa/main/texcompress_s3tc.c > @@ -49,8 +49,6 @@ > > #if defined(_WIN32) || defined(WIN32) > #define DXTN_LIBNAME "dxtn.dll" > -#define RTLD_LAZY 0 > -#define RTLD_GLOBAL 0 > #elif defined(__DJGPP__) > #define DXTN_LIBNAME "dxtn.dxe" > #else > -- > 1.8.1.4 > > From 83cfba631c655cca24fec72d8c0b8e672ca79cc0 Mon Sep 17 00:00:00 2001 > Message-Id: > <83cfba631c655cca24fec72d8c0b8e672ca79cc0.1366832037.git.mathias.froehl...@gmx.net> > In-Reply-To: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > References: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <mathias.froehl...@gmx.net> > Date: Sun, 20 Jan 2013 09:45:27 +0100 > Subject: [PATCH 5/8] mesa: Use RTLD_LOCAL | RTLD_DEEPBIND instead of > RTLD_GLOBAL. > > To avoid symbol collisions due to the increasing use of shared > linking, which in turn requires some more symbols to be visible, > load drivers without pushing their symbols into the global > namespace. > The only user of this mesa function as of today is loading > the compression library shared object, which should be loaded > with private symbols anyway. > > Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> > --- > src/mesa/main/dlopen.h | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/src/mesa/main/dlopen.h b/src/mesa/main/dlopen.h > index 55a56f0..5646622 100644 > --- a/src/mesa/main/dlopen.h > +++ b/src/mesa/main/dlopen.h > @@ -50,7 +50,10 @@ _mesa_dlopen(const char *libname, int flags) > #if defined(__blrts) > return NULL; > #elif defined(HAVE_DLOPEN) > - flags = RTLD_LAZY | RTLD_GLOBAL; /* Overriding flags at this time */ > + flags = RTLD_LAZY | RTLD_LOCAL; /* Overriding flags at this time */ > +#ifdef RTLD_DEEPBIND > + flags |= RTLD_DEEPBIND; > +#endif > return dlopen(libname, flags); > #elif defined(__MINGW32__) > return LoadLibraryA(libname); > -- > 1.8.1.4 > > From 26c5a5a01c3fd9f765465e50df86bd8bb35f1a1a Mon Sep 17 00:00:00 2001 > Message-Id: > <26c5a5a01c3fd9f765465e50df86bd8bb35f1a1a.1366832037.git.mathias.froehl...@gmx.net> > In-Reply-To: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > References: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <mathias.froehl...@gmx.net> > Date: Sun, 20 Jan 2013 09:45:28 +0100 > Subject: [PATCH 7/8] egl/glx: Use RTLD_DEEPBIND if available. > > Increase the symbol isolation level for the chain loaded > libGL.so that provides the backend for egl. > > Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> > --- > src/egl/drivers/glx/egl_glx.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/src/egl/drivers/glx/egl_glx.c b/src/egl/drivers/glx/egl_glx.c > index 8fe19f9..a74b1ac 100644 > --- a/src/egl/drivers/glx/egl_glx.c > +++ b/src/egl/drivers/glx/egl_glx.c > @@ -50,6 +50,10 @@ > #include "egllog.h" > #include "eglsurface.h" > > +#ifndef RTLD_DEEPBIND > +#define RTLD_DEEPBIND 0 > +#endif > + > #define CALLOC_STRUCT(T) (struct T *) calloc(1, sizeof(struct T)) > > #ifndef GLX_VERSION_1_4 > @@ -1074,7 +1078,7 @@ GLX_Load(_EGLDriver *drv) > if (!GLX_drv->glXGetProcAddress) > GLX_drv->glXGetProcAddress = dlsym(RTLD_DEFAULT, > "glXGetProcAddressARB"); > if (!GLX_drv->glXGetProcAddress) { > - handle = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL); > + handle = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND); > if (!handle) > goto fail; > > -- > 1.8.1.4 > > From e4dac328fa9effa058e27e0fd5e2b399ac7f0d92 Mon Sep 17 00:00:00 2001 > Message-Id: > <e4dac328fa9effa058e27e0fd5e2b399ac7f0d92.1366832037.git.mathias.froehl...@gmx.net> > In-Reply-To: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > References: > <c43a2ae15fe3adaa764175d076d07895351834f6.1366832037.git.mathias.froehl...@gmx.net> > From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= <mathias.froehl...@gmx.net> > Date: Sun, 20 Jan 2013 09:45:28 +0100 > Subject: [PATCH 8/8] egl/glx: Load libGL.so.1 to get glx entry points. > > Probe for libGL.so.1 instead of libGL.so since the later > is typically only installed with the development libraries > and the former comes with the runtime packages. > > Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> > --- > src/egl/drivers/glx/egl_glx.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/src/egl/drivers/glx/egl_glx.c b/src/egl/drivers/glx/egl_glx.c > index a74b1ac..6decc39 100644 > --- a/src/egl/drivers/glx/egl_glx.c > +++ b/src/egl/drivers/glx/egl_glx.c > @@ -1078,7 +1078,9 @@ GLX_Load(_EGLDriver *drv) > if (!GLX_drv->glXGetProcAddress) > GLX_drv->glXGetProcAddress = dlsym(RTLD_DEFAULT, > "glXGetProcAddressARB"); > if (!GLX_drv->glXGetProcAddress) { > - handle = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND); > + handle = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND); > + if (!handle) > + handle = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND); > if (!handle) > goto fail; > > -- > 1.8.1.4 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev