mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-21 11:08:24 +02:00
libEGL was incorrectly exporting *all* symbols, public and private.
This patch adds -fvisibility=hidden to libEGL's linker flags to ensure
that only symbols annotated with __attribute__((visibility("default")))
get exported.
Sanity-checked with libEGL's builtin DRI2 driver and the i965 DRI driver
by running Piglit on X/EGL and by running weston-gears on Weston as an
X client.
Sanity-checked with libEGL's Gallium driver (which is not built-in) and
the swrast Gallium driver by running es2gears_x11.
Kristian reviewed the symbol diff in `nm libEGL.so`.
CC: "9.2" <mesa-stable@lists.freedesktop.org>
CC: Ian Romanick <idr@freedesktop.org>
Acked-by: Kristian Høgsberg <krh@bitplanet.net>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
|
||
|---|---|---|
| .. | ||
| Android.mk | ||
| egl.def | ||
| egl.pc.in | ||
| eglapi.c | ||
| eglapi.h | ||
| eglarray.c | ||
| eglarray.h | ||
| eglcompiler.h | ||
| eglconfig.c | ||
| eglconfig.h | ||
| eglcontext.c | ||
| eglcontext.h | ||
| eglcurrent.c | ||
| eglcurrent.h | ||
| egldefines.h | ||
| egldisplay.c | ||
| egldisplay.h | ||
| egldriver.c | ||
| egldriver.h | ||
| eglfallbacks.c | ||
| eglglobals.c | ||
| eglglobals.h | ||
| eglimage.c | ||
| eglimage.h | ||
| egllog.c | ||
| egllog.h | ||
| eglmisc.c | ||
| eglmisc.h | ||
| eglmode.c | ||
| eglmode.h | ||
| eglmutex.h | ||
| eglscreen.c | ||
| eglscreen.h | ||
| eglstring.c | ||
| eglstring.h | ||
| eglsurface.c | ||
| eglsurface.h | ||
| eglsync.c | ||
| eglsync.h | ||
| egltypedefs.h | ||
| Makefile.am | ||
| README.txt | ||
| SConscript | ||
Notes about the EGL library: The EGL code here basically consists of two things: 1. An EGL API dispatcher. This directly routes all the eglFooBar() API calls into driver-specific functions. 2. Fallbacks for EGL API functions. A driver _could_ implement all the EGL API calls from scratch. But in many cases, the fallbacks provided in libEGL (such as eglChooseConfig()) will do the job. Bootstrapping: When the apps calls eglOpenDisplay() a device driver is selected and loaded (look for dlsym() or LoadLibrary() in egldriver.c). The driver's _eglMain() function is then called. This driver function allocates, initializes and returns a new _EGLDriver object (usually a subclass of that type). As part of initialization, the dispatch table in _EGLDriver->API must be populated with all the EGL entrypoints. Typically, _eglInitDriverFallbacks() can be used to plug in default/fallback functions. Some functions like driver->API.Initialize and driver->API.Terminate _must_ be implemented with driver-specific code (no default/fallback function is possible). A bit later, the app will call eglInitialize(). This will get routed to the driver->API.Initialize() function. Any additional driver initialization that wasn't done in _eglMain() should be done at this point. Typically, this will involve setting up visual configs, etc. Special Functions: Certain EGL functions _must_ be implemented by the driver. This includes: eglCreateContext eglCreateWindowSurface eglCreatePixmapSurface eglCreatePBufferSurface eglMakeCurrent eglSwapBuffers Most of the EGLConfig-related functions can be implemented with the defaults/fallbacks. Same thing for the eglGet/Query functions. Teardown: When eglTerminate() is called, the driver->API.Terminate() function is called. The driver should clean up after itself. eglTerminate() will then close/unload the driver (shared library). Subclassing: The internal libEGL data structures such as _EGLDisplay, _EGLContext, _EGLSurface, etc should be considered base classes from which drivers will derive subclasses.