mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
build: move stack protector flag selection to meson
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
6739825aa6
commit
911d4caaa2
4 changed files with 34 additions and 43 deletions
44
configure
vendored
44
configure
vendored
|
@ -180,7 +180,7 @@ compile_prog() {
|
||||||
local_cflags="$1"
|
local_cflags="$1"
|
||||||
local_ldflags="$2"
|
local_ldflags="$2"
|
||||||
do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
|
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".
|
# symbolically link $1 to $2. Portable version of "ln -sf".
|
||||||
|
@ -226,7 +226,6 @@ static="no"
|
||||||
cross_compile="no"
|
cross_compile="no"
|
||||||
cross_prefix=""
|
cross_prefix=""
|
||||||
host_cc="cc"
|
host_cc="cc"
|
||||||
stack_protector=""
|
|
||||||
use_containers="yes"
|
use_containers="yes"
|
||||||
gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
|
gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
|
||||||
gdb_arches=""
|
gdb_arches=""
|
||||||
|
@ -394,8 +393,6 @@ sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
|
||||||
QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
|
QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
|
||||||
QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
|
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
|
# Flags that are needed during configure but later taken care of by Meson
|
||||||
CONFIGURE_CFLAGS="-std=gnu11 -Wall"
|
CONFIGURE_CFLAGS="-std=gnu11 -Wall"
|
||||||
CONFIGURE_LDFLAGS=
|
CONFIGURE_LDFLAGS=
|
||||||
|
@ -824,10 +821,6 @@ for opt do
|
||||||
;;
|
;;
|
||||||
--disable-werror) werror="no"
|
--disable-werror) werror="no"
|
||||||
;;
|
;;
|
||||||
--enable-stack-protector) stack_protector="yes"
|
|
||||||
;;
|
|
||||||
--disable-stack-protector) stack_protector="no"
|
|
||||||
;;
|
|
||||||
--enable-cfi)
|
--enable-cfi)
|
||||||
cfi="true";
|
cfi="true";
|
||||||
meson_option_add -Db_lto=true
|
meson_option_add -Db_lto=true
|
||||||
|
@ -998,7 +991,6 @@ Advanced options (experts only):
|
||||||
--with-devices-ARCH=NAME override default configs/devices
|
--with-devices-ARCH=NAME override default configs/devices
|
||||||
--enable-debug enable common debug build options
|
--enable-debug enable common debug build options
|
||||||
--disable-werror disable compilation abort on warning
|
--disable-werror disable compilation abort on warning
|
||||||
--disable-stack-protector disable compiler-provided stack protection
|
|
||||||
--cpu=CPU Build for host CPU [$cpu]
|
--cpu=CPU Build for host CPU [$cpu]
|
||||||
--enable-plugins
|
--enable-plugins
|
||||||
enable plugins via shared library loading
|
enable plugins via shared library loading
|
||||||
|
@ -1257,7 +1249,7 @@ EOF
|
||||||
optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
|
optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
|
||||||
do_objc -Werror $optflag \
|
do_objc -Werror $optflag \
|
||||||
$OBJCFLAGS $EXTRA_OBJCFLAGS $CONFIGURE_OBJCFLAGS $QEMU_OBJCFLAGS \
|
$OBJCFLAGS $EXTRA_OBJCFLAGS $CONFIGURE_OBJCFLAGS $QEMU_OBJCFLAGS \
|
||||||
-o $TMPE $TMPM $QEMU_LDFLAGS
|
-o $TMPE $TMPM
|
||||||
}
|
}
|
||||||
|
|
||||||
for flag in $gcc_flags; do
|
for flag in $gcc_flags; do
|
||||||
|
@ -1269,37 +1261,6 @@ for flag in $gcc_flags; do
|
||||||
fi
|
fi
|
||||||
done
|
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
|
|
||||||
|
|
||||||
if test "$static" = "yes" ; then
|
if test "$static" = "yes" ; then
|
||||||
if test "$plugins" = "yes"; then
|
if test "$plugins" = "yes"; then
|
||||||
error_exit "static and plugins are mutually incompatible"
|
error_exit "static and plugins are mutually incompatible"
|
||||||
|
@ -2057,7 +2018,6 @@ echo "PKG_CONFIG=${pkg_config}" >> $config_host_mak
|
||||||
echo "CC=$cc" >> $config_host_mak
|
echo "CC=$cc" >> $config_host_mak
|
||||||
echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
|
echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
|
||||||
echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $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
|
echo "EXESUF=$EXESUF" >> $config_host_mak
|
||||||
|
|
||||||
# use included Linux headers
|
# use included Linux headers
|
||||||
|
|
28
meson.build
28
meson.build
|
@ -200,7 +200,7 @@ foreach arg : config_host['QEMU_CFLAGS'].split()
|
||||||
endif
|
endif
|
||||||
endforeach
|
endforeach
|
||||||
qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
|
qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
|
||||||
qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
|
qemu_ldflags = []
|
||||||
|
|
||||||
if get_option('gprof')
|
if get_option('gprof')
|
||||||
qemu_common_flags += ['-p']
|
qemu_common_flags += ['-p']
|
||||||
|
@ -211,6 +211,32 @@ if get_option('prefer_static')
|
||||||
qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
|
qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
|
||||||
endif
|
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')
|
coroutine_backend = get_option('coroutine_backend')
|
||||||
ucontext_probe = '''
|
ucontext_probe = '''
|
||||||
#include <ucontext.h>
|
#include <ucontext.h>
|
||||||
|
|
|
@ -91,6 +91,8 @@ option('sanitizers', type: 'boolean', value: false,
|
||||||
description: 'enable default sanitizers')
|
description: 'enable default sanitizers')
|
||||||
option('tsan', type: 'boolean', value: false,
|
option('tsan', type: 'boolean', value: false,
|
||||||
description: 'enable thread sanitizer')
|
description: 'enable thread sanitizer')
|
||||||
|
option('stack_protector', type: 'feature', value: 'auto',
|
||||||
|
description: 'compiler-provided stack protection')
|
||||||
option('cfi', type: 'boolean', value: false,
|
option('cfi', type: 'boolean', value: false,
|
||||||
description: 'Control-Flow Integrity (CFI)')
|
description: 'Control-Flow Integrity (CFI)')
|
||||||
option('cfi_debug', type: 'boolean', value: false,
|
option('cfi_debug', type: 'boolean', value: false,
|
||||||
|
|
|
@ -165,6 +165,7 @@ meson_options_help() {
|
||||||
printf "%s\n" ' sparse sparse checker'
|
printf "%s\n" ' sparse sparse checker'
|
||||||
printf "%s\n" ' spice Spice server support'
|
printf "%s\n" ' spice Spice server support'
|
||||||
printf "%s\n" ' spice-protocol Spice protocol 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" ' tcg TCG support'
|
||||||
printf "%s\n" ' tools build support utilities that come with QEMU'
|
printf "%s\n" ' tools build support utilities that come with QEMU'
|
||||||
printf "%s\n" ' tpm TPM support'
|
printf "%s\n" ' tpm TPM support'
|
||||||
|
@ -443,6 +444,8 @@ _meson_option_parse() {
|
||||||
--disable-spice) printf "%s" -Dspice=disabled ;;
|
--disable-spice) printf "%s" -Dspice=disabled ;;
|
||||||
--enable-spice-protocol) printf "%s" -Dspice_protocol=enabled ;;
|
--enable-spice-protocol) printf "%s" -Dspice_protocol=enabled ;;
|
||||||
--disable-spice-protocol) printf "%s" -Dspice_protocol=disabled ;;
|
--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 ;;
|
--enable-strip) printf "%s" -Dstrip=true ;;
|
||||||
--disable-strip) printf "%s" -Dstrip=false ;;
|
--disable-strip) printf "%s" -Dstrip=false ;;
|
||||||
--sysconfdir=*) quote_sh "-Dsysconfdir=$2" ;;
|
--sysconfdir=*) quote_sh "-Dsysconfdir=$2" ;;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue