[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CA+icZUV1eoXkVXGEVD-8rMeh+6y7bwXC91R3EqaT5CKf_=D5fw@mail.gmail.com>
Date: Sun, 29 May 2022 16:42:23 +0200
From: Sedat Dilek <sedat.dilek@...il.com>
To: Masahiro Yamada <masahiroy@...nel.org>
Cc: linux-kbuild@...r.kernel.org,
Nick Desaulniers <ndesaulniers@...gle.com>,
linux-kernel@...r.kernel.org, Josh Poimboeuf <jpoimboe@...hat.com>,
Michal Marek <michal.lkml@...kovi.net>,
Nathan Chancellor <nathan@...nel.org>,
Tom Rix <trix@...hat.com>, llvm@...ts.linux.dev
Subject: Re: [PATCH 3/4] kbuild: move vmlinux.o link to scripts/Makefile.vmlinux_o
On Sat, May 28, 2022 at 8:25 PM Masahiro Yamada <masahiroy@...nel.org> wrote:
>
> This is a preparation for the objtool move in the next commit.
>
> Signed-off-by: Masahiro Yamada <masahiroy@...nel.org>
Tested-by: Sedat Dilek <sedat.dilek@...il.com> # LLVM-14 (x86-64)
-Sedat-
> ---
>
> scripts/Makefile.vmlinux_o | 61 ++++++++++++++++++++++++++++++++++++++
> scripts/link-vmlinux.sh | 41 +------------------------
> 2 files changed, 62 insertions(+), 40 deletions(-)
> create mode 100644 scripts/Makefile.vmlinux_o
>
> diff --git a/scripts/Makefile.vmlinux_o b/scripts/Makefile.vmlinux_o
> new file mode 100644
> index 000000000000..a9b375ca86d5
> --- /dev/null
> +++ b/scripts/Makefile.vmlinux_o
> @@ -0,0 +1,61 @@
> +# SPDX-License-Identifier: GPL-2.0-only
> +
> +PHONY := __default
> +__default: vmlinux.o
> +
> +include include/config/auto.conf
> +include $(srctree)/scripts/Kbuild.include
> +
> +# Generate a linker script to ensure correct ordering of initcalls for Clang LTO
> +# ---------------------------------------------------------------------------
> +
> +quiet_cmd_gen_initcalls_lds = GEN $@
> + cmd_gen_initcalls_lds = \
> + $(PYTHON3) $(srctree)/scripts/jobserver-exec \
> + $(PERL) $(real-prereqs) > $@
> +
> +.tmp_initcalls.lds: $(srctree)/scripts/generate_initcall_order.pl \
> + $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> + $(call if_changed,gen_initcalls_lds)
> +
> +targets := .tmp_initcalls.lds
> +
> +ifdef CONFIG_LTO_CLANG
> +initcalls-lds := .tmp_initcalls.lds
> +endif
> +
> +# Link of vmlinux.o used for section mismatch analysis
> +# ---------------------------------------------------------------------------
> +
> +quiet_cmd_ld_vmlinux.o = LD $@
> + cmd_ld_vmlinux.o = \
> + $(LD) ${KBUILD_LDFLAGS} -r -o $@ \
> + $(addprefix -T , $(initcalls-lds)) \
> + --whole-archive $(KBUILD_VMLINUX_OBJS) --no-whole-archive \
> + --start-group $(KBUILD_VMLINUX_LIBS) --end-group \
> +
> +define rule_ld_vmlinux.o
> + $(call cmd_and_savecmd,ld_vmlinux.o)
> +endef
> +
> +vmlinux.o: $(initcalls-lds) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> + $(call if_changed_rule,ld_vmlinux.o)
> +
> +targets += vmlinux.o
> +
> +# Add FORCE to the prequisites of a target to force it to be always rebuilt.
> +# ---------------------------------------------------------------------------
> +
> +PHONY += FORCE
> +FORCE:
> +
> +# Read all saved command lines and dependencies for the $(targets) we
> +# may be building above, using $(if_changed{,_dep}). As an
> +# optimization, we don't need to read them if the target does not
> +# exist, we will rebuild anyway in that case.
> +
> +existing-targets := $(wildcard $(sort $(targets)))
> +
> +-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
> +
> +.PHONY: $(PHONY)
> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index b593cb1a8137..90680b6bd710 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -45,45 +45,6 @@ info()
> printf " %-7s %s\n" "${1}" "${2}"
> }
>
> -# Generate a linker script to ensure correct ordering of initcalls.
> -gen_initcalls()
> -{
> - info GEN .tmp_initcalls.lds
> -
> - ${PYTHON3} ${srctree}/scripts/jobserver-exec \
> - ${PERL} ${srctree}/scripts/generate_initcall_order.pl \
> - ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS} \
> - > .tmp_initcalls.lds
> -}
> -
> -# Link of vmlinux.o used for section mismatch analysis
> -# ${1} output file
> -modpost_link()
> -{
> - local objects
> - local lds=""
> -
> - objects="--whole-archive \
> - ${KBUILD_VMLINUX_OBJS} \
> - --no-whole-archive \
> - --start-group \
> - ${KBUILD_VMLINUX_LIBS} \
> - --end-group"
> -
> - if is_enabled CONFIG_LTO_CLANG; then
> - gen_initcalls
> - lds="-T .tmp_initcalls.lds"
> -
> - # This might take a while, so indicate that we're doing
> - # an LTO link
> - info LTO ${1}
> - else
> - info LD ${1}
> - fi
> -
> - ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${lds} ${objects}
> -}
> -
> objtool_link()
> {
> local objtoolcmd;
> @@ -336,7 +297,7 @@ fi;
> ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1
>
> #link vmlinux.o
> -modpost_link vmlinux.o
> +${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o"
> objtool_link vmlinux.o
>
> # Generate the list of objects in vmlinux
> --
> 2.32.0
>
Powered by blists - more mailing lists