On Mon, Nov 15, 2021 at 8:46 AM Nathan Chancellor <nathan@xxxxxxxxxx> wrote: > > This patch is for linux-5.10.y only. > > When scripts/lld-version.sh was initially written, it did not account > for the LLD_VENDOR cmake flag, which changes the output of ld.lld's > --version flag slightly. > > Without LLD_VENDOR: > > $ ld.lld --version > LLD 14.0.0 (compatible with GNU linkers) > > With LLD_VENDOR: > > $ ld.lld --version > Debian LLD 14.0.0 (compatible with GNU linkers) > > As a result, CONFIG_LLD_VERSION is messed up and configuration values > that are dependent on it cannot be selected: > > scripts/lld-version.sh: 20: printf: LLD: expected numeric value > scripts/lld-version.sh: 20: printf: LLD: expected numeric value > scripts/lld-version.sh: 20: printf: LLD: expected numeric value > init/Kconfig:52:warning: 'LLD_VERSION': number is invalid > .config:11:warning: symbol value '00000' invalid for LLD_VERSION > .config:8800:warning: override: CPU_BIG_ENDIAN changes choice state > > This was fixed upstream by commit 1f09af062556 ("kbuild: Fix > ld-version.sh script if LLD was built with LLD_VENDOR") in 5.12 but that > was done to ld-version.sh after it was massively rewritten in > commit 02aff8592204 ("kbuild: check the minimum linker version in > Kconfig"). > > To avoid bringing in that change plus its prerequisites and fixes, just > modify lld-version.sh to make it similar to the upstream ld-version.sh, > which handles ld.lld with or without LLD_VENDOR and ld.bfd without any > errors. > > Signed-off-by: Nathan Chancellor <nathan@xxxxxxxxxx> Thanks for the fix. Reviewed-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx> Tested-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx> > --- > > Our CI caught this error with newer versions of Debian's ld.lld, which > added LLD_VENDOR it seems: > > https://github.com/ClangBuiltLinux/continuous-integration2/runs/4206343929?check_suite_focus=true > > A similar change was done by me for Android, where it has seen no > issues: > > https://android-review.googlesource.com/c/kernel/common/+/1744324 > > I believe this is a safer change than backporting the fixes from > upstream but if you guys feel otherwise, I can do so. This is only > needed in 5.10 as CONFIG_LLD_VERSION does not exist in 5.4 and it was > fixed in 5.12 upstream. > > scripts/lld-version.sh | 35 ++++++++++++++++++++++++++--------- > 1 file changed, 26 insertions(+), 9 deletions(-) > > diff --git a/scripts/lld-version.sh b/scripts/lld-version.sh > index d70edb4d8a4f..f1eeee450a23 100755 > --- a/scripts/lld-version.sh > +++ b/scripts/lld-version.sh > @@ -6,15 +6,32 @@ > # Print the linker version of `ld.lld' in a 5 or 6-digit form > # such as `100001' for ld.lld 10.0.1 etc. > > -linker_string="$($* --version)" > +set -e > > -if ! ( echo $linker_string | grep -q LLD ); then > +# Convert the version string x.y.z to a canonical 5 or 6-digit form. > +get_canonical_version() > +{ > + IFS=. > + set -- $1 > + > + # If the 2nd or 3rd field is missing, fill it with a zero. > + echo $((10000 * $1 + 100 * ${2:-0} + ${3:-0})) > +} > + > +# Get the first line of the --version output. > +IFS=' > +' > +set -- $(LC_ALL=C "$@" --version) > + > +# Split the line on spaces. > +IFS=' ' > +set -- $1 > + > +while [ $# -gt 1 -a "$1" != "LLD" ]; do > + shift > +done > +if [ "$1" = LLD ]; then > + echo $(get_canonical_version ${2%-*}) > +else > echo 0 > - exit 1 > fi > - > -VERSION=$(echo $linker_string | cut -d ' ' -f 2) > -MAJOR=$(echo $VERSION | cut -d . -f 1) > -MINOR=$(echo $VERSION | cut -d . -f 2) > -PATCHLEVEL=$(echo $VERSION | cut -d . -f 3) > -printf "%d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL > > base-commit: bd816c278316f20a5575debc64dde4422229a880 > -- > 2.34.0.rc0 > -- Thanks, ~Nick Desaulniers