qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 24/30] build: move stack protector flag selection to meson


From: Marc-André Lureau
Subject: Re: [PATCH 24/30] build: move stack protector flag selection to meson
Date: Mon, 12 Dec 2022 16:22:01 +0400

Hi

On Fri, Dec 9, 2022 at 3:42 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure                     | 44 ++---------------------------------
>  meson.build                   | 28 +++++++++++++++++++++-
>  meson_options.txt             |  2 ++
>  scripts/meson-buildoptions.sh |  3 +++
>  4 files changed, 34 insertions(+), 43 deletions(-)
>
> diff --git a/configure b/configure
> index 1f7c5bbba4b9..5d31294f316f 100755
> --- a/configure
> +++ b/configure
> @@ -175,7 +175,7 @@ compile_prog() {
>    local_cflags="$1"
>    local_ldflags="$2"
>    do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags 
> -o $TMPE $TMPC \
> -      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
> +      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $local_ldflags
>  }
>
>  # symbolically link $1 to $2.  Portable version of "ln -sf".
> @@ -221,7 +221,6 @@ static="no"
>  cross_compile="no"
>  cross_prefix=""
>  host_cc="cc"
> -stack_protector=""
>  use_containers="yes"
>  gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
>
> @@ -370,8 +369,6 @@ sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
>  QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
>  QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE 
> $QEMU_CFLAGS"
>
> -QEMU_LDFLAGS=
> -
>  # Flags that are needed during configure but later taken care of by Meson
>  CONFIGURE_CFLAGS="-std=gnu11 -Wall"
>  CONFIGURE_LDFLAGS=
> @@ -773,10 +770,6 @@ for opt do
>    ;;
>    --disable-werror) werror="no"
>    ;;
> -  --enable-stack-protector) stack_protector="yes"
> -  ;;
> -  --disable-stack-protector) stack_protector="no"
> -  ;;
>    --enable-cfi)
>        cfi="true";
>        meson_option_add -Db_lto=true
> @@ -944,7 +937,6 @@ Advanced options (experts only):
>    --with-devices-ARCH=NAME override default configs/devices
>    --enable-debug           enable common debug build options
>    --disable-werror         disable compilation abort on warning
> -  --disable-stack-protector disable compiler-provided stack protection
>    --cpu=CPU                Build for host CPU [$cpu]
>    --enable-plugins
>                             enable plugins via shared library loading
> @@ -1157,7 +1149,7 @@ EOF
>      optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
>      do_objc -Werror $optflag \
>        $OBJCFLAGS $EXTRA_OBJCFLAGS $CONFIGURE_OBJCFLAGS $QEMU_OBJCFLAGS \
> -      -o $TMPE $TMPM $QEMU_LDFLAGS
> +      -o $TMPE $TMPM
>  }
>
>  for flag in $gcc_flags; do
> @@ -1169,37 +1161,6 @@ for flag in $gcc_flags; do
>      fi
>  done
>
> -if test "$stack_protector" != "no"; then
> -  cat > $TMPC << EOF
> -int main(int argc, char *argv[])
> -{
> -    char arr[64], *p = arr, *c = argv[argc - 1];
> -    while (*c) {
> -        *p++ = *c++;
> -    }
> -    return 0;
> -}
> -EOF
> -  gcc_flags="-fstack-protector-strong -fstack-protector-all"
> -  sp_on=0
> -  for flag in $gcc_flags; do
> -    # We need to check both a compile and a link, since some compiler
> -    # setups fail only on a .c->.o compile and some only at link time
> -    if compile_object "-Werror $flag" &&
> -       compile_prog "-Werror $flag" ""; then
> -      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
> -      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
> -      sp_on=1
> -      break
> -    fi
> -  done
> -  if test "$stack_protector" = yes; then
> -    if test $sp_on = 0; then
> -      error_exit "Stack protector not supported"
> -    fi
> -  fi
> -fi
> -
>  # Disable -Wmissing-braces on older compilers that warn even for
>  # the "universal" C zero initializer {0}.
>  cat > $TMPC << EOF
> @@ -1968,7 +1929,6 @@ echo "PKG_CONFIG=${pkg_config_exe}" >> $config_host_mak
>  echo "CC=$cc" >> $config_host_mak
>  echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
>  echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
> -echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
>  echo "EXESUF=$EXESUF" >> $config_host_mak
>
>  # use included Linux headers
> diff --git a/meson.build b/meson.build
> index b9df49667a19..c5a8dce9e1d6 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -200,7 +200,7 @@ foreach arg : config_host['QEMU_CFLAGS'].split()
>    endif
>  endforeach
>  qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
> -qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
> +qemu_ldflags = []
>
>  if get_option('gprof')
>    qemu_common_flags += ['-p']
> @@ -211,6 +211,32 @@ if get_option('prefer_static')
>    qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
>  endif
>
> +if not get_option('stack_protector').disabled()
> +  stack_protector_probe = '''
> +    int main(int argc, char *argv[])
> +    {
> +      char arr[64], *p = arr, *c = argv[argc - 1];
> +      while (*c) {
> +          *p++ = *c++;
> +      }
> +      return 0;
> +    }'''
> +  have_stack_protector = false
> +  foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
> +    # We need to check both a compile and a link, since some compiler
> +    # setups fail only on a .c->.o compile and some only at link time
> +    if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
> +       cc.links(stack_protector_probe, args: ['-Werror', arg])
> +      have_stack_protector = true
> +      qemu_cflags += arg
> +      qemu_ldflags += arg
> +      break
> +    endif
> +  endforeach
> +  get_option('stack_protector') \
> +    .require(have_stack_protector, error_message: 'Stack protector not 
> supported')
> +endif
> +
>  coroutine_backend = get_option('coroutine_backend')
>  ucontext_probe = '''
>    #include <ucontext.h>
> diff --git a/meson_options.txt b/meson_options.txt
> index 126f89517e9a..98456b7cf2ea 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -93,6 +93,8 @@ option('sanitizers', type: 'boolean', value: false,
>         description: 'enable default sanitizers')
>  option('tsan', type: 'boolean', value: false,
>         description: 'enable thread sanitizer')
> +option('stack_protector', type: 'feature', value: 'auto',
> +       description: 'compiler-provided stack protection')
>  option('cfi', type: 'boolean', value: false,
>         description: 'Control-Flow Integrity (CFI)')
>  option('cfi_debug', type: 'boolean', value: false,
> diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
> index 29695ac88eea..a87b3702e955 100644
> --- a/scripts/meson-buildoptions.sh
> +++ b/scripts/meson-buildoptions.sh
> @@ -157,6 +157,7 @@ meson_options_help() {
>    printf "%s\n" '  sparse          sparse checker'
>    printf "%s\n" '  spice           Spice server support'
>    printf "%s\n" '  spice-protocol  Spice protocol support'
> +  printf "%s\n" '  stack-protector compiler-provided stack protection'
>    printf "%s\n" '  tcg             TCG support'
>    printf "%s\n" '  tools           build support utilities that come with 
> QEMU'
>    printf "%s\n" '  tpm             TPM support'
> @@ -424,6 +425,8 @@ _meson_option_parse() {
>      --disable-spice) printf "%s" -Dspice=disabled ;;
>      --enable-spice-protocol) printf "%s" -Dspice_protocol=enabled ;;
>      --disable-spice-protocol) printf "%s" -Dspice_protocol=disabled ;;
> +    --enable-stack-protector) printf "%s" -Dstack_protector=enabled ;;
> +    --disable-stack-protector) printf "%s" -Dstack_protector=disabled ;;
>      --enable-strip) printf "%s" -Dstrip=true ;;
>      --disable-strip) printf "%s" -Dstrip=false ;;
>      --sysconfdir=*) quote_sh "-Dsysconfdir=$2" ;;
> --
> 2.38.1
>
>


-- 
Marc-André Lureau



reply via email to

[Prev in Thread] Current Thread [Next in Thread]