xref: /openbmc/linux/scripts/ld-version.sh (revision 6e4f6b5eac461867471b3f368699097b31843d23)
102aff859SMasahiro Yamada#!/bin/sh
2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0
302aff859SMasahiro Yamada#
402aff859SMasahiro Yamada# Print the linker name and its version in a 5 or 6-digit form.
502aff859SMasahiro Yamada# Also, perform the minimum version check.
602aff859SMasahiro Yamada
702aff859SMasahiro Yamadaset -e
802aff859SMasahiro Yamada
902aff859SMasahiro Yamada# Convert the version string x.y.z to a canonical 5 or 6-digit form.
1002aff859SMasahiro Yamadaget_canonical_version()
11ccbef167SAndi Kleen{
1202aff859SMasahiro Yamada	IFS=.
1302aff859SMasahiro Yamada	set -- $1
1402aff859SMasahiro Yamada
1502aff859SMasahiro Yamada	# If the 2nd or 3rd field is missing, fill it with a zero.
1602aff859SMasahiro Yamada	#
1702aff859SMasahiro Yamada	# The 4th field, if present, is ignored.
1802aff859SMasahiro Yamada	# This occurs in development snapshots as in 2.35.1.20201116
1902aff859SMasahiro Yamada	echo $((10000 * $1 + 100 * ${2:-0} + ${3:-0}))
20ccbef167SAndi Kleen}
2102aff859SMasahiro Yamada
2202aff859SMasahiro Yamadaorig_args="$@"
2302aff859SMasahiro Yamada
2402aff859SMasahiro Yamada# Get the first line of the --version output.
2502aff859SMasahiro YamadaIFS='
2602aff859SMasahiro Yamada'
27bcbcf50fSMasahiro Yamadaset -- $(LC_ALL=C "$@" --version)
2802aff859SMasahiro Yamada
2902aff859SMasahiro Yamada# Split the line on spaces.
3002aff859SMasahiro YamadaIFS=' '
3102aff859SMasahiro Yamadaset -- $1
3202aff859SMasahiro Yamada
33e24b3ffcSMasahiro Yamadamin_tool_version=$(dirname $0)/min-tool-version.sh
34e24b3ffcSMasahiro Yamada
3502aff859SMasahiro Yamadaif [ "$1" = GNU -a "$2" = ld ]; then
3602aff859SMasahiro Yamada	shift $(($# - 1))
3702aff859SMasahiro Yamada	version=$1
38e24b3ffcSMasahiro Yamada	min_version=$($min_tool_version binutils)
3902aff859SMasahiro Yamada	name=BFD
4002aff859SMasahiro Yamada	disp_name="GNU ld"
4102aff859SMasahiro Yamadaelif [ "$1" = GNU -a "$2" = gold ]; then
4202aff859SMasahiro Yamada	echo "gold linker is not supported as it is not capable of linking the kernel proper." >&2
4302aff859SMasahiro Yamada	exit 1
441f09af06SBernhard Rosenkränzerelse
451f09af06SBernhard Rosenkränzer	while [ $# -gt 1 -a "$1" != "LLD" ]; do
461f09af06SBernhard Rosenkränzer		shift
471f09af06SBernhard Rosenkränzer	done
481f09af06SBernhard Rosenkränzer
491f09af06SBernhard Rosenkränzer	if [ "$1" = LLD ]; then
5002aff859SMasahiro Yamada		version=$2
51e24b3ffcSMasahiro Yamada		min_version=$($min_tool_version llvm)
5202aff859SMasahiro Yamada		name=LLD
5302aff859SMasahiro Yamada		disp_name=LLD
5402aff859SMasahiro Yamada	else
5502aff859SMasahiro Yamada		echo "$orig_args: unknown linker" >&2
5602aff859SMasahiro Yamada		exit 1
5702aff859SMasahiro Yamada	fi
581f09af06SBernhard Rosenkränzerfi
5902aff859SMasahiro Yamada
60*e243c117SNathan Chancellor# There may be something after the version, such as a distribution's package
61*e243c117SNathan Chancellor# release number (like Fedora's "2.34-4.fc32") or punctuation (like LLD briefly
62*e243c117SNathan Chancellor# added before the "compatible with GNU linkers" string), so remove everything
63*e243c117SNathan Chancellor# after just numbers and periods.
64*e243c117SNathan Chancellorversion=${version%%[!0-9.]*}
6502aff859SMasahiro Yamada
6602aff859SMasahiro Yamadacversion=$(get_canonical_version $version)
6702aff859SMasahiro Yamadamin_cversion=$(get_canonical_version $min_version)
6802aff859SMasahiro Yamada
6902aff859SMasahiro Yamadaif [ "$cversion" -lt "$min_cversion" ]; then
7002aff859SMasahiro Yamada	echo >&2 "***"
7102aff859SMasahiro Yamada	echo >&2 "*** Linker is too old."
7202aff859SMasahiro Yamada	echo >&2 "***   Your $disp_name version:    $version"
7302aff859SMasahiro Yamada	echo >&2 "***   Minimum $disp_name version: $min_version"
7402aff859SMasahiro Yamada	echo >&2 "***"
7502aff859SMasahiro Yamada	exit 1
7602aff859SMasahiro Yamadafi
7702aff859SMasahiro Yamada
7802aff859SMasahiro Yamadaecho $name $cversion
79