mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Commit3fb0fdb3bb("x86/stackprotector/32: Make the canary into a regular percpu variable") modified the stackprotector check on 32-bit x86 to check if gcc supports using %fs as canary. Adjust dummy-tools gcc script to pass this new test by returning "%fs" rather than "%gs" if it detects -mstack-protector-guard-reg=fs on command line. Fixes:3fb0fdb3bb("x86/stackprotector/32: Make the canary into a regular percpu variable") Signed-off-by: Michal Kubecek <mkubecek@suse.cz> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
		
			
				
	
	
		
			111 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/bin/sh
 | 
						|
# SPDX-License-Identifier: GPL-2.0-only
 | 
						|
#
 | 
						|
# Staring v4.18, Kconfig evaluates compiler capabilities, and hides CONFIG
 | 
						|
# options your compiler does not support. This works well if you configure and
 | 
						|
# build the kernel on the same host machine.
 | 
						|
#
 | 
						|
# It is inconvenient if you prepare the .config that is carried to a different
 | 
						|
# build environment (typically this happens when you package the kernel for
 | 
						|
# distros) because using a different compiler potentially produces different
 | 
						|
# CONFIG options than the real build environment. So, you probably want to make
 | 
						|
# as many options visible as possible. In other words, you need to create a
 | 
						|
# super-set of CONFIG options that cover any build environment. If some of the
 | 
						|
# CONFIG options turned out to be unsupported on the build machine, they are
 | 
						|
# automatically disabled by the nature of Kconfig.
 | 
						|
#
 | 
						|
# However, it is not feasible to get a full-featured compiler for every arch.
 | 
						|
# Hence these dummy toolchains to make all compiler tests pass.
 | 
						|
#
 | 
						|
# Usage:
 | 
						|
#
 | 
						|
# From the top directory of the source tree, run
 | 
						|
#
 | 
						|
#   $ make CROSS_COMPILE=scripts/dummy-tools/ oldconfig
 | 
						|
#
 | 
						|
# Most of compiler features are tested by cc-option, which simply checks the
 | 
						|
# exit code of $(CC). This script does nothing and just exits with 0 in most
 | 
						|
# cases. So, $(cc-option, ...) is evaluated as 'y'.
 | 
						|
#
 | 
						|
# This scripts caters to more checks; handle --version and pre-process __GNUC__
 | 
						|
# etc. to pretend to be GCC, and also do right things to satisfy some scripts.
 | 
						|
 | 
						|
# Check if the first parameter appears in the rest. Succeeds if found.
 | 
						|
# This helper is useful if a particular option was passed to this script.
 | 
						|
# Typically used like this:
 | 
						|
#   arg_contain <word-you-are-searching-for> "$@"
 | 
						|
arg_contain ()
 | 
						|
{
 | 
						|
	search="$1"
 | 
						|
	shift
 | 
						|
 | 
						|
	while [ $# -gt 0 ]
 | 
						|
	do
 | 
						|
		if [ "$search" = "$1" ]; then
 | 
						|
			return 0
 | 
						|
		fi
 | 
						|
		shift
 | 
						|
	done
 | 
						|
 | 
						|
	return 1
 | 
						|
}
 | 
						|
 | 
						|
# To set CONFIG_CC_IS_GCC=y
 | 
						|
if arg_contain --version "$@"; then
 | 
						|
	echo "gcc (scripts/dummy-tools/gcc)"
 | 
						|
	exit 0
 | 
						|
fi
 | 
						|
 | 
						|
if arg_contain -E "$@"; then
 | 
						|
	# For scripts/cc-version.sh; This emulates GCC 20.0.0
 | 
						|
	if arg_contain - "$@"; then
 | 
						|
		sed -n '/^GCC/{s/__GNUC__/20/; s/__GNUC_MINOR__/0/; s/__GNUC_PATCHLEVEL__/0/; p;}'
 | 
						|
		exit 0
 | 
						|
	else
 | 
						|
		echo "no input files" >&2
 | 
						|
		exit 1
 | 
						|
	fi
 | 
						|
fi
 | 
						|
 | 
						|
# To set CONFIG_AS_IS_GNU
 | 
						|
if arg_contain -Wa,--version "$@"; then
 | 
						|
	echo "GNU assembler (scripts/dummy-tools) 2.50"
 | 
						|
	exit 0
 | 
						|
fi
 | 
						|
 | 
						|
if arg_contain -S "$@"; then
 | 
						|
	# For scripts/gcc-x86-*-has-stack-protector.sh
 | 
						|
	if arg_contain -fstack-protector "$@"; then
 | 
						|
		if arg_contain -mstack-protector-guard-reg=fs "$@"; then
 | 
						|
			echo "%fs"
 | 
						|
		else
 | 
						|
			echo "%gs"
 | 
						|
		fi
 | 
						|
		exit 0
 | 
						|
	fi
 | 
						|
 | 
						|
	# For arch/powerpc/tools/gcc-check-mprofile-kernel.sh
 | 
						|
	if arg_contain -m64 "$@" && arg_contain -mlittle-endian "$@" &&
 | 
						|
		arg_contain -mprofile-kernel "$@"; then
 | 
						|
		if ! test -t 0 && ! grep -q notrace; then
 | 
						|
			echo "_mcount"
 | 
						|
		fi
 | 
						|
		exit 0
 | 
						|
	fi
 | 
						|
fi
 | 
						|
 | 
						|
# To set GCC_PLUGINS
 | 
						|
if arg_contain -print-file-name=plugin "$@"; then
 | 
						|
	plugin_dir=$(mktemp -d)
 | 
						|
 | 
						|
	mkdir -p $plugin_dir/include
 | 
						|
	touch $plugin_dir/include/plugin-version.h
 | 
						|
 | 
						|
	echo $plugin_dir
 | 
						|
	exit 0
 | 
						|
fi
 | 
						|
 | 
						|
# inverted return value
 | 
						|
if arg_contain -D__SIZEOF_INT128__=0 "$@"; then
 | 
						|
	exit 1
 | 
						|
fi
 |