egl: Skip closing drivers when building with AddressSanitizer.

If you dlclose your driver, the leak reports look like:

    #0 0xffff9c7e5e7c in malloc (/lib/aarch64-linux-gnu/libasan.so.6+0x9ee7c)
    #1 0xffff94aaaa48  (<unknown module>)
    #2 0xffff94aa5ff4  (<unknown module>)
    #3 0xffff94d1867c  (<unknown module>)
    #4 0xffff94d184f0  (<unknown module>)
    #5 0xffff94c9a990  (<unknown module>)
    #6 0xffff94c92e30  (<unknown module>)
    #7 0xffff94c91d48  (<unknown module>)
    #8 0xffff946eb800  (/home/anholt/src/mesa/build-aarch64-asan/src/egl/libEGL.so.1.0.0+0xfe800)
    #9 0xffff94c72874  (<unknown module>)
    #10 0xffff946ede68  (/home/anholt/src/mesa/build-aarch64-asan/src/egl/libEGL.so.1.0.0+0x100e68)
    #11 0xffff94bf7134  (<unknown module>)
    #12 0xffff9c686450 in dri2_create_screen ../src/egl/drivers/dri2/egl_dri2.c:1079

which is not terribly useful.  Probe if we're building with asan and just
skip closing the driver in the happy path (which seems to be the standard
practice for loadable modules with this tool).

Acked-by: Michel Dänzer <mdaenzer@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7695>
This commit is contained in:
Eric Anholt
2020-11-17 16:50:36 -08:00
committed by Marge Bot
parent 9cc8fc7bbc
commit 661b292834
3 changed files with 17 additions and 1 deletions

View File

@@ -1648,6 +1648,15 @@ else
dep_valgrind = null_dep
endif
# AddressSanitizer's leak reports need all the symbols to be present at exit to
# decode well, which runs afoul of our dlopen()/dlclose()ing of the DRI drivers.
# Set a flag so we can skip the dlclose for asan builds.
if ['address', 'address,undefined'].contains(get_option('b_sanitize'))
asan_c_args = ['-DBUILT_WITH_ASAN=1']
else
asan_c_args = ['-DBUILT_WITH_ASAN=0']
endif
# pthread stubs. Lets not and say we didn't
if host_machine.system() == 'windows'

View File

@@ -1237,8 +1237,15 @@ dri2_display_destroy(_EGLDisplay *disp)
}
if (dri2_dpy->fd >= 0)
close(dri2_dpy->fd);
/* Don't dlclose the driver when building with the address sanitizer, so you
* get good symbols from the leak reports.
*/
#if !BUILT_WITH_ASAN || defined(NDEBUG)
if (dri2_dpy->driver)
dlclose(dri2_dpy->driver);
#endif
free(dri2_dpy->driver_name);
#ifdef HAVE_WAYLAND_PLATFORM

View File

@@ -21,7 +21,7 @@
inc_egl = include_directories('.', 'main')
inc_egl_dri2 = include_directories('drivers/dri2')
c_args_for_egl = []
c_args_for_egl = [asan_c_args]
link_for_egl = []
deps_for_egl = []
incs_for_egl = [inc_include, inc_src, inc_egl]