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