[Mesa-dev] [PATCH 1/2] scons: Allow building with Address Sanitizer.

Roland Scheidegger sroland at vmware.com
Tue Apr 12 16:54:22 UTC 2016


Am 12.04.2016 um 18:03 schrieb Jose Fonseca:
> libasan is never linked to shared objects (which doesn't go well with
> -z,defs).  It must either be linked to the main executable, or (more
> practically for OpenGL drivers) be pre-loaded via LD_PRELOAD.
> 
> Otherwise works.
> 
> I didn't find anything with llvmpipe.  I suspect the fact that the
> JIT compiled code isn't instrumented means there are lots of errors it
> can't catch.
> 
> But for non-JIT drivers, the Address/Leak Sanitizers seem like a faster
> alternative to Valgrind.
> 
> Usage (Ubuntu 15.10):
> 
>    scons asan=1 libgl-xlib
>    export LD_LIBRARY_PATH=$PWD/build/linux-x86_64-debug/gallium/targets/libgl-xlib
>    LD_PRELOAD=libasan.so.2 any-opengl-application
> ---
>  common.py                                 |  1 +
>  scons/gallium.py                          | 12 +++++++++++-
>  src/gallium/targets/libgl-xlib/SConscript | 12 ++++++++----
>  src/mesa/drivers/x11/SConscript           |  8 ++++++--
>  4 files changed, 26 insertions(+), 7 deletions(-)
> 
> diff --git a/common.py b/common.py
> index 7a93941..70e6708 100644
> --- a/common.py
> +++ b/common.py
> @@ -97,6 +97,7 @@ def AddOptions(opts):
>      opts.Add(BoolOption('embedded', 'embedded build', 'no'))
>      opts.Add(BoolOption('analyze',
>                          'enable static code analysis where available', 'no'))
> +    opts.Add(BoolOption('asan', 'enable Address Sanitizer', 'no'))
>      opts.Add('toolchain', 'compiler toolchain', default_toolchain)
>      opts.Add(BoolOption('gles', 'EXPERIMENTAL: enable OpenGL ES support',
>                          'no'))
> diff --git a/scons/gallium.py b/scons/gallium.py
> index 4652016..f37042d 100755
> --- a/scons/gallium.py
> +++ b/scons/gallium.py
> @@ -410,7 +410,7 @@ def generate(env):
>          # Work around aliasing bugs - developers should comment this out
>          ccflags += ['-fno-strict-aliasing']
>          ccflags += ['-g']
> -        if env['build'] in ('checked', 'profile'):
> +        if env['build'] in ('checked', 'profile') or env['asan']:
>              # See http://code.google.com/p/jrfonseca/wiki/Gprof2Dot#Which_options_should_I_pass_to_gcc_when_compiling_for_profiling?
>              ccflags += [
>                  '-fno-omit-frame-pointer',
> @@ -540,6 +540,16 @@ def generate(env):
>              # scan-build will produce more comprehensive output
>              env.Append(CCFLAGS = ['--analyze'])
>  
> +    # https://github.com/google/sanitizers/wiki/AddressSanitizer
> +    if env['asan']:
> +        if gcc_compat:
> +            env.Append(CCFLAGS = [
> +                '-fsanitize=address',
> +            ])
> +            env.Append(LINKFLAGS = [
> +                '-fsanitize=address',
> +            ])
> +
>      # Assembler options
>      if gcc_compat:
>          if env['machine'] == 'x86':
> diff --git a/src/gallium/targets/libgl-xlib/SConscript b/src/gallium/targets/libgl-xlib/SConscript
> index e1c78dd..1c816ff 100644
> --- a/src/gallium/targets/libgl-xlib/SConscript
> +++ b/src/gallium/targets/libgl-xlib/SConscript
> @@ -48,11 +48,15 @@ if env['llvm']:
>      env.Prepend(LIBS = [llvmpipe])
>  
>  if env['platform'] != 'darwin':
> +    # Disallow undefined symbols, except with Address Sanitizer, since libasan
> +    # is not linked on shared libs, as it should be LD_PRELOAD'ed instead
> +    if not env['asan']:
> +        env.Append(SHLINKFLAGS = [
> +            '-Wl,-z,defs',
> +        ])
>      env.Append(SHLINKFLAGS = [
> -       # Disallow undefined symbols
> -       '-Wl,-z,defs',
> -       # Restrict exported symbols
> -       '-Wl,--version-script=%s' % File("libgl-xlib.sym").srcnode().path,
> +        # Restrict exported symbols
> +        '-Wl,--version-script=%s' % File("libgl-xlib.sym").srcnode().path,
>      ])
>  
>  # libGL.so.1.5
> diff --git a/src/mesa/drivers/x11/SConscript b/src/mesa/drivers/x11/SConscript
> index 4541997..59c8df4 100644
> --- a/src/mesa/drivers/x11/SConscript
> +++ b/src/mesa/drivers/x11/SConscript
> @@ -34,9 +34,13 @@ sources = [
>  	'xm_tri.c',
>  ]
>  
> -# Disallow undefined symbols
>  if env['platform'] != 'darwin':
> -    env.Append(SHLINKFLAGS = ['-Wl,-z,defs'])
> +    # Disallow undefined symbols, except with Address Sanitizer, since libasan
> +    # is not linked on shared libs, as it should be LD_PRELOAD'ed instead
> +    if not env['asan']:
> +        env.Append(SHLINKFLAGS = [
> +            '-Wl,-z,defs',
> +        ])
>  
>  # libGL.so.1.6
>  libgl_1_6 = env.SharedLibrary(
> 

Makes sense to me.
Acked-by: Roland Scheidegger <sroland at vmware.com>



More information about the mesa-dev mailing list