Message ID | 20201113195553.1487659-2-natechancellor@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] kbuild: Hoist '--orphan-handling' into Kconfig | expand |
On Fri, Nov 13, 2020 at 11:56 AM Nathan Chancellor <natechancellor@gmail.com> wrote: > > ld.lld 10.0.1 spews a bunch of various warnings about .rela sections, > along with a few others. Newer versions of ld.lld do not have these > warnings. As a result, do not add '--orphan-handling=warn' to > LDFLAGS_vmlinux if ld.lld's version is not new enough. > > Reported-by: Arvind Sankar <nivedita@alum.mit.edu> > Reported-by: kernelci.org bot <bot@kernelci.org> > Reported-by: Mark Brown <broonie@kernel.org> > Link: https://github.com/ClangBuiltLinux/linux/issues/1187 > Link: https://github.com/ClangBuiltLinux/linux/issues/1193 > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> > --- > MAINTAINERS | 1 + > init/Kconfig | 6 +++++- > scripts/lld-version.sh | 20 ++++++++++++++++++++ > 3 files changed, 26 insertions(+), 1 deletion(-) > create mode 100755 scripts/lld-version.sh > > diff --git a/MAINTAINERS b/MAINTAINERS > index 3da6d8c154e4..4b83d3591ec7 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -4284,6 +4284,7 @@ B: https://github.com/ClangBuiltLinux/linux/issues > C: irc://chat.freenode.net/clangbuiltlinux > F: Documentation/kbuild/llvm.rst > F: scripts/clang-tools/ > +F: scripts/lld-version.sh > K: \b(?i:clang|llvm)\b > > CLEANCACHE API > diff --git a/init/Kconfig b/init/Kconfig > index a270716562de..40c9ca60ac1d 100644 > --- a/init/Kconfig > +++ b/init/Kconfig > @@ -47,6 +47,10 @@ config CLANG_VERSION > int > default $(shell,$(srctree)/scripts/clang-version.sh $(CC)) > > +config LLD_VERSION > + int > + default $(shell,$(srctree)/scripts/lld-version.sh $(LD)) > + > config CC_CAN_LINK > bool > default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m64-flag)) if 64BIT > @@ -1349,7 +1353,7 @@ config LD_DEAD_CODE_DATA_ELIMINATION > own risk. > > config LD_ORPHAN_WARN > - def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) > + def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) && (!LD_IS_LLD || LLD_VERSION >= 110000) > > config SYSCTL > bool > diff --git a/scripts/lld-version.sh b/scripts/lld-version.sh > new file mode 100755 > index 000000000000..cc779f412e39 > --- /dev/null > +++ b/scripts/lld-version.sh > @@ -0,0 +1,20 @@ > +#!/bin/sh > +# SPDX-License-Identifier: GPL-2.0 > +# > +# ld.lld-version ld.lld-command ^ it looks like this format was copied from scripts/gcc-version, but it's kind of curious/cryptic to me for a comment about usage. Is it necessary? A comment in the form: # Usage: ./scripts/lld-version.sh ld.lld Would be clearer to me. > +# > +# Print the linker version of `ld.lld-command' in a 5 or 6-digit form > +# such as `100001' for ld.lld 10.0.1 etc. > + > +linker="$*" > + > +if ! ( $linker --version | grep -q LLD ); then > + echo 0 > + exit 1 > +fi > + > +VERSION=$($linker --version | cut -d ' ' -f 2) This is going to invoke the linker potentially twice if it's LLD. Would it be nicer to capture the output of `$linker --version`, check which linker it is, then slice that up via `cut` to get the version? This version is fine to me, but if you're going to send a v2, that might be a nice slight cleanup. Otherwise, Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Tested-by: Nick Desaulniers <ndesaulniers@google.com> (Please drop those tags if you modify this for v2 and I'll rereview/retest). > +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 > -- > 2.29.2 >
On Fri, Nov 13, 2020 at 12:55:53PM -0700, Nathan Chancellor wrote: > config LD_ORPHAN_WARN > - def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) > + def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) && (!LD_IS_LLD || LLD_VERSION >= 110000) Readability nit-pick... I prefer separate "depends" lines to make things a little easier to parse, change, etc: config LD_ORPHAN_WARN def_bool y depends on ARCH_WANT_LD_ORPHAN_WARN depends on !LD_IS_LLD || LLD_VERSION >= 110000 depends on $(ld-option,--orphan-handling=warn) Otherwise, yeah, looks good to me. With this and the other suggestions, please consider it: Reviewed-by: Kees Cook <keescook@chromium.org>
On Tue, Nov 17, 2020 at 11:41:15AM -0800, Nick Desaulniers wrote: > On Fri, Nov 13, 2020 at 11:56 AM Nathan Chancellor > <natechancellor@gmail.com> wrote: > > > > ld.lld 10.0.1 spews a bunch of various warnings about .rela sections, > > along with a few others. Newer versions of ld.lld do not have these > > warnings. As a result, do not add '--orphan-handling=warn' to > > LDFLAGS_vmlinux if ld.lld's version is not new enough. > > > > Reported-by: Arvind Sankar <nivedita@alum.mit.edu> > > Reported-by: kernelci.org bot <bot@kernelci.org> > > Reported-by: Mark Brown <broonie@kernel.org> > > Link: https://github.com/ClangBuiltLinux/linux/issues/1187 > > Link: https://github.com/ClangBuiltLinux/linux/issues/1193 > > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> > > --- > > MAINTAINERS | 1 + > > init/Kconfig | 6 +++++- > > scripts/lld-version.sh | 20 ++++++++++++++++++++ > > 3 files changed, 26 insertions(+), 1 deletion(-) > > create mode 100755 scripts/lld-version.sh > > > > diff --git a/MAINTAINERS b/MAINTAINERS > > index 3da6d8c154e4..4b83d3591ec7 100644 > > --- a/MAINTAINERS > > +++ b/MAINTAINERS > > @@ -4284,6 +4284,7 @@ B: https://github.com/ClangBuiltLinux/linux/issues > > C: irc://chat.freenode.net/clangbuiltlinux > > F: Documentation/kbuild/llvm.rst > > F: scripts/clang-tools/ > > +F: scripts/lld-version.sh > > K: \b(?i:clang|llvm)\b > > > > CLEANCACHE API > > diff --git a/init/Kconfig b/init/Kconfig > > index a270716562de..40c9ca60ac1d 100644 > > --- a/init/Kconfig > > +++ b/init/Kconfig > > @@ -47,6 +47,10 @@ config CLANG_VERSION > > int > > default $(shell,$(srctree)/scripts/clang-version.sh $(CC)) > > > > +config LLD_VERSION > > + int > > + default $(shell,$(srctree)/scripts/lld-version.sh $(LD)) > > + > > config CC_CAN_LINK > > bool > > default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m64-flag)) if 64BIT > > @@ -1349,7 +1353,7 @@ config LD_DEAD_CODE_DATA_ELIMINATION > > own risk. > > > > config LD_ORPHAN_WARN > > - def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) > > + def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) && (!LD_IS_LLD || LLD_VERSION >= 110000) > > > > config SYSCTL > > bool > > diff --git a/scripts/lld-version.sh b/scripts/lld-version.sh > > new file mode 100755 > > index 000000000000..cc779f412e39 > > --- /dev/null > > +++ b/scripts/lld-version.sh > > @@ -0,0 +1,20 @@ > > +#!/bin/sh > > +# SPDX-License-Identifier: GPL-2.0 > > +# > > +# ld.lld-version ld.lld-command > > ^ it looks like this format was copied from scripts/gcc-version, but > it's kind of curious/cryptic to me for a comment about usage. Is it > necessary? A comment in the form: > > # Usage: ./scripts/lld-version.sh ld.lld > > Would be clearer to me. > > > +# > > +# Print the linker version of `ld.lld-command' in a 5 or 6-digit form > > +# such as `100001' for ld.lld 10.0.1 etc. > > + > > +linker="$*" > > + > > +if ! ( $linker --version | grep -q LLD ); then > > + echo 0 > > + exit 1 > > +fi > > + > > +VERSION=$($linker --version | cut -d ' ' -f 2) > > This is going to invoke the linker potentially twice if it's LLD. > Would it be nicer to capture the output of `$linker --version`, check > which linker it is, then slice that up via `cut` to get the version? > > This version is fine to me, but if you're going to send a v2, that > might be a nice slight cleanup. Otherwise, > > Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> > Tested-by: Nick Desaulniers <ndesaulniers@google.com> > > (Please drop those tags if you modify this for v2 and I'll rereview/retest). Below is the impending v2 if you wanted to give it an early test, I plan to send it along formally Thursday morning with all of the addressed feedback so far. Cheers, Nathan ====================================================================== From 1ef9b12daf2b19ed6687423483d5bb1f5cf82e13 Mon Sep 17 00:00:00 2001 From: Nathan Chancellor <natechancellor@gmail.com> Date: Tue, 17 Nov 2020 20:11:26 -0700 Subject: [PATCH] kbuild: Disable CONFIG_LD_ORPHAN_WARN for ld.lld 10.0.1 ld.lld 10.0.1 spews a bunch of various warnings about .rela sections, along with a few others. Newer versions of ld.lld do not have these warnings. As a result, do not add '--orphan-handling=warn' to LDFLAGS_vmlinux if ld.lld's version is not new enough. Link: https://github.com/ClangBuiltLinux/linux/issues/1187 Link: https://github.com/ClangBuiltLinux/linux/issues/1193 Reported-by: Arvind Sankar <nivedita@alum.mit.edu> Reported-by: kernelci.org bot <bot@kernelci.org> Reported-by: Mark Brown <broonie@kernel.org> Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> --- MAINTAINERS | 1 + init/Kconfig | 9 ++++++++- scripts/lld-version.sh | 20 ++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100755 scripts/lld-version.sh diff --git a/MAINTAINERS b/MAINTAINERS index e451dcce054f..e6f74f130ae1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4284,6 +4284,7 @@ B: https://github.com/ClangBuiltLinux/linux/issues C: irc://chat.freenode.net/clangbuiltlinux F: Documentation/kbuild/llvm.rst F: scripts/clang-tools/ +F: scripts/lld-version.sh K: \b(?i:clang|llvm)\b CLEANCACHE API diff --git a/init/Kconfig b/init/Kconfig index a270716562de..b9037d6c5ab3 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -47,6 +47,10 @@ config CLANG_VERSION int default $(shell,$(srctree)/scripts/clang-version.sh $(CC)) +config LLD_VERSION + int + default $(shell,$(srctree)/scripts/lld-version.sh $(LD)) + config CC_CAN_LINK bool default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m64-flag)) if 64BIT @@ -1349,7 +1353,10 @@ config LD_DEAD_CODE_DATA_ELIMINATION own risk. config LD_ORPHAN_WARN - def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) + def_bool y + depends on ARCH_WANT_LD_ORPHAN_WARN + depends on !LD_IS_LLD || LLD_VERSION >= 110000 + depends on $(ld-option,--orphan-handling=warn) config SYSCTL bool diff --git a/scripts/lld-version.sh b/scripts/lld-version.sh new file mode 100755 index 000000000000..d70edb4d8a4f --- /dev/null +++ b/scripts/lld-version.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# Usage: $ ./scripts/lld-version.sh ld.lld +# +# 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)" + +if ! ( echo $linker_string | grep -q LLD ); then + 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
On Tue, Nov 17, 2020 at 01:51:43PM -0800, Kees Cook wrote: > On Fri, Nov 13, 2020 at 12:55:53PM -0700, Nathan Chancellor wrote: > > config LD_ORPHAN_WARN > > - def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) > > + def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) && (!LD_IS_LLD || LLD_VERSION >= 110000) > > Readability nit-pick... I prefer separate "depends" lines to make things > a little easier to parse, change, etc: > > config LD_ORPHAN_WARN > def_bool y > depends on ARCH_WANT_LD_ORPHAN_WARN > depends on !LD_IS_LLD || LLD_VERSION >= 110000 > depends on $(ld-option,--orphan-handling=warn) > > Otherwise, yeah, looks good to me. With this and the other suggestions, > please consider it: > > Reviewed-by: Kees Cook <keescook@chromium.org> Thank you, I have updated it locally for v2! Cheers, Nathan
diff --git a/MAINTAINERS b/MAINTAINERS index 3da6d8c154e4..4b83d3591ec7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4284,6 +4284,7 @@ B: https://github.com/ClangBuiltLinux/linux/issues C: irc://chat.freenode.net/clangbuiltlinux F: Documentation/kbuild/llvm.rst F: scripts/clang-tools/ +F: scripts/lld-version.sh K: \b(?i:clang|llvm)\b CLEANCACHE API diff --git a/init/Kconfig b/init/Kconfig index a270716562de..40c9ca60ac1d 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -47,6 +47,10 @@ config CLANG_VERSION int default $(shell,$(srctree)/scripts/clang-version.sh $(CC)) +config LLD_VERSION + int + default $(shell,$(srctree)/scripts/lld-version.sh $(LD)) + config CC_CAN_LINK bool default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m64-flag)) if 64BIT @@ -1349,7 +1353,7 @@ config LD_DEAD_CODE_DATA_ELIMINATION own risk. config LD_ORPHAN_WARN - def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) + def_bool ARCH_WANT_LD_ORPHAN_WARN && $(ld-option,--orphan-handling=warn) && (!LD_IS_LLD || LLD_VERSION >= 110000) config SYSCTL bool diff --git a/scripts/lld-version.sh b/scripts/lld-version.sh new file mode 100755 index 000000000000..cc779f412e39 --- /dev/null +++ b/scripts/lld-version.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# ld.lld-version ld.lld-command +# +# Print the linker version of `ld.lld-command' in a 5 or 6-digit form +# such as `100001' for ld.lld 10.0.1 etc. + +linker="$*" + +if ! ( $linker --version | grep -q LLD ); then + echo 0 + exit 1 +fi + +VERSION=$($linker --version | 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
ld.lld 10.0.1 spews a bunch of various warnings about .rela sections, along with a few others. Newer versions of ld.lld do not have these warnings. As a result, do not add '--orphan-handling=warn' to LDFLAGS_vmlinux if ld.lld's version is not new enough. Reported-by: Arvind Sankar <nivedita@alum.mit.edu> Reported-by: kernelci.org bot <bot@kernelci.org> Reported-by: Mark Brown <broonie@kernel.org> Link: https://github.com/ClangBuiltLinux/linux/issues/1187 Link: https://github.com/ClangBuiltLinux/linux/issues/1193 Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> --- MAINTAINERS | 1 + init/Kconfig | 6 +++++- scripts/lld-version.sh | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100755 scripts/lld-version.sh