kbuild: remove redundant cleanups in scripts/link-vmlinux.sh
PATCH 1/4 kbuild: remove redundant cleanups in scripts/link-vmlinux.sh
These are cleaned by the top Makefile.
vmlinux.o and .vmlinux.d matches the '*.[aios]' and '.*.d' patterns respectively.
---
scripts/link-vmlinux.sh | 2 -- 1 file changed, 2 deletions(-)
scripts/link-vmlinux.sh +0 -2
@@ -309,8 +309,6 @@ cleanup() rm -f System.map rm -f vmlinux rm -f vmlinux.map - rm -f vmlinux.o - rm -f .vmlinux.d rm -f .vmlinux.objs rm -f .vmlinux.export.c }
Signature · 1 line
2.32.0
PATCH 2/4 kbuild: clean .tmp_* pattern by make clean
Change the "make clean" rule to remove all the .tmp_* files.
.tmp_objdiff is the only exception, which should be removed by "make mrproper".
Rename the record directory of objdiff, .tmp_objdiff to .objdiff to avoid the removal by "make clean".
---
Makefile | 4 ++-- scripts/link-vmlinux.sh | 3 --- scripts/objdiff | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-)
Makefile +2 -2
@@ -1490,7 +1490,7 @@ CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \ # Directories & files removed with 'make mrproper' MRPROPER_FILES += include/config include/generated \ - arch/$(SRCARCH)/include/generated .tmp_objdiff \ + arch/$(SRCARCH)/include/generated .objdiff \ debian snap tar-install \ .config .config.old .version \ Module.symvers \
@@ -1857,7 +1857,7 @@ clean: $(clean-dirs) -o -name '*.lex.c' -o -name '*.tab.[ch]' \ -o -name '*.asn1.[ch]' \ -o -name '*.symtypes' -o -name 'modules.order' \ - -o -name '.tmp_*.o.*' \ + -o -name '.tmp_*' \ -o -name '*.c.[012]*.*' \ -o -name '*.ll' \ -o -name '*.gcno' \
scripts/link-vmlinux.sh +0 -3
@@ -303,9 +303,6 @@ sorttable() cleanup() { rm -f .btf.* - rm -f .tmp_System.map - rm -f .tmp_initcalls.lds - rm -f .tmp_vmlinux* rm -f System.map rm -f vmlinux rm -f vmlinux.map
scripts/objdiff +1 -1
@@ -32,7 +32,7 @@ if [ -z "$SRCTREE" ]; then exit 1 fi -TMPD=$SRCTREE/.tmp_objdiff +TMPD=$SRCTREE/.objdiff usage() { echo >&2 "Usage: $0 <command> <args>"
Signature · 1 line
2.32.0
Re: [PATCH 2/4] kbuild: clean .tmp_* pattern by make clean
Quoted 10 lines · Masahiro Yamada
Change the "make clean" rule to remove all the .tmp_* files.
.tmp_objdiff is the only exception, which should be removed by "make mrproper".
Rename the record directory of objdiff, .tmp_objdiff to .objdiff to avoid the removal by "make clean".
Signed-off-by Masahiro Yamada <[email protected]>
When does someone see .objdiff file(s)?
( Never seen here. )
-Sedat-
Quoted 59 lines
---
Makefile | 4 ++-- scripts/link-vmlinux.sh | 3 --- scripts/objdiff | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-)Makefile +2
-2@@ -1490,7 +1490,7 @@ CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \ # Directories & files removed with 'make mrproper' MRPROPER_FILES += include/config include/generated \ - arch/$(SRCARCH)/include/generated .tmp_objdiff \ + arch/$(SRCARCH)/include/generated .objdiff \ debian snap tar-install \ .config .config.old .version \ Module.symvers \@@ -1857,7 +1857,7 @@ clean: $(clean-dirs) -o -name '*.lex.c' -o -name '*.tab.[ch]' \ -o -name '*.asn1.[ch]' \ -o -name '*.symtypes' -o -name 'modules.order' \ - -o -name '.tmp_*.o.*' \ + -o -name '.tmp_*' \ -o -name '*.c.[012]*.*' \ -o -name '*.ll' \ -o -name '*.gcno' \scripts/link-vmlinux.sh +0
-3@@ -303,9 +303,6 @@ sorttable() cleanup() { rm -f .btf.* - rm -f .tmp_System.map - rm -f .tmp_initcalls.lds - rm -f .tmp_vmlinux* rm -f System.map rm -f vmlinux rm -f vmlinux.mapscripts/objdiff +1
-2@@ -32,7 +32,7 @@ if [ -z "$SRCTREE" ]; then exit 1 fi -TMPD=$SRCTREE/.tmp_objdiff +TMPD=$SRCTREE/.objdiff usage() { echo >&2 "Usage: $0 <command> <args>" --2.32.0
Re: [PATCH 2/4] kbuild: clean .tmp_* pattern by make clean
Quoted 8 lines · Sedat Dilek
Quoted 6 lines · Masahiro Yamada
Change the "make clean" rule to remove all the .tmp_* files.
.tmp_objdiff is the only exception, which should be removed by "make mrproper".
Quoted 6 lines
Quoted 4 lines
Rename the record directory of objdiff, .tmp_objdiff to .objdiff to avoid the removal by "make clean".
Signed-off-by Masahiro Yamada <[email protected]>When does someone see .objdiff file(s)?
It is created when you run scripts/objdiff
Quoted 65 lines
( Never seen here. )
-Sedat-
Quoted 59 lines
---
Makefile | 4 ++-- scripts/link-vmlinux.sh | 3 --- scripts/objdiff | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-)Makefile +2
-2@@ -1490,7 +1490,7 @@ CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \ # Directories & files removed with 'make mrproper' MRPROPER_FILES += include/config include/generated \ - arch/$(SRCARCH)/include/generated .tmp_objdiff \ + arch/$(SRCARCH)/include/generated .objdiff \ debian snap tar-install \ .config .config.old .version \ Module.symvers \@@ -1857,7 +1857,7 @@ clean: $(clean-dirs) -o -name '*.lex.c' -o -name '*.tab.[ch]' \ -o -name '*.asn1.[ch]' \ -o -name '*.symtypes' -o -name 'modules.order' \ - -o -name '.tmp_*.o.*' \ + -o -name '.tmp_*' \ -o -name '*.c.[012]*.*' \ -o -name '*.ll' \ -o -name '*.gcno' \scripts/link-vmlinux.sh +0
-3@@ -303,9 +303,6 @@ sorttable() cleanup() { rm -f .btf.* - rm -f .tmp_System.map - rm -f .tmp_initcalls.lds - rm -f .tmp_vmlinux* rm -f System.map rm -f vmlinux rm -f vmlinux.mapscripts/objdiff +1
-2@@ -32,7 +32,7 @@ if [ -z "$SRCTREE" ]; then exit 1 fi -TMPD=$SRCTREE/.tmp_objdiff +TMPD=$SRCTREE/.objdiff usage() { echo >&2 "Usage: $0 <command> <args>" --2.32.0
Signature · 2 lines
Best Regards Masahiro Yamada
Re: [PATCH 2/4] kbuild: clean .tmp_* pattern by make clean
On Sun, May 29, 2022 at 7:33 PM Masahiro Yamada <[email protected]> wrote:
...
Quoted 4 lines
Quoted 1 line
When does someone see .objdiff file(s)?
It is created when you run
scripts/objdiff
Never used this - thanks for the info.
-sed@-
Re: [PATCH 2/4] kbuild: clean .tmp_* pattern by make clean
In reply to Masahiro YamadaQuoted 16 lines · Masahiro Yamada
Change the "make clean" rule to remove all the .tmp_* files.
.tmp_objdiff is the only exception, which should be removed by "make mrproper".
Rename the record directory of objdiff, .tmp_objdiff to .objdiff to avoid the removal by "make clean".
Signed-off-by Masahiro Yamada <[email protected]>---
Makefile | 4 ++-- scripts/link-vmlinux.sh | 3 --- scripts/objdiff | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-)
...
scripts/objdiff if [ -z "$SRCTREE" ]; then · line 38
Quoted 13 lines
scripts/objdiff +1
-1@@ -32,7 +32,7 @@ if [ -z "$SRCTREE" ]; then exit 1 fi -TMPD=$SRCTREE/.tmp_objdiff +TMPD=$SRCTREE/.objdiff usage() { echo >&2 "Usage: $0 <command> <args>"
scripts/objdiff still has two occurrences of .tmp_objdiff (in the comment block at the top).
Re: [PATCH 2/4] kbuild: clean .tmp_* pattern by make clean
Quoted 27 lines · Nicolas Schier
Quoted 16 lines · Masahiro Yamada
Change the "make clean" rule to remove all the .tmp_* files.
.tmp_objdiff is the only exception, which should be removed by "make mrproper".
Rename the record directory of objdiff, .tmp_objdiff to .objdiff to avoid the removal by "make clean".
Signed-off-by Masahiro Yamada <[email protected]>---
Makefile | 4 ++-- scripts/link-vmlinux.sh | 3 --- scripts/objdiff | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-)...
Quoted 8 lines
scripts/objdiff +0
-0@@ -32,7 +32,7 @@ if [ -z "$SRCTREE" ]; then exit 1 fi
Quoted 8 lines
scripts/objdiff if [ -z "$SRCTREE" ]; then · line 38
Quoted 5 lines
scripts/objdiff +1
-1-TMPD=$SRCTREE/.tmp_objdiff +TMPD=$SRCTREE/.objdiff usage() { echo >&2 "Usage: $0 <command> <args>"
scripts/objdiffstill has two occurrences of .tmp_objdiff (in the comment block at the top).
Ah, thank you for catching it.
I sent a fixup.
Signature · 2 lines
Best Regards Masahiro Yamada
PATCH 3/4 kbuild: move vmlinux.o link to scripts/Makefile.vmlinux_o
In reply to Masahiro YamadaThis is a preparation for the objtool move in the next commit.
---
scripts/Makefile.vmlinux_o | 61 ++++++++++++++++++++++++++++++++++++++ scripts/link-vmlinux.sh | 41 +------------------------ 2 files changed, 62 insertions(+), 40 deletions(-) create mode 100644 scripts/Makefile.vmlinux_o
scripts/Makefile.vmlinux_o new file +61 -0
@@ -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)
scripts/link-vmlinux.sh +1 -40
53 lines not on this page · raw message
Signature · 1 line
2.32.0
Re: [PATCH 3/4] kbuild: move vmlinux.o link to scripts/Makefile.vmlinux_o
Quoted 4 lines · Masahiro Yamada
This is a preparation for the objtool move in the next commit.
Signed-off-by Masahiro Yamada <[email protected]>
-Sedat-
Quoted 136 lines
---
scripts/Makefile.vmlinux_o | 61 ++++++++++++++++++++++++++++++++++++++ scripts/link-vmlinux.sh | 41 +------------------------ 2 files changed, 62 insertions(+), 40 deletions(-) create mode 100644 scripts/Makefile.vmlinux_oscripts/Makefile.vmlinux_o new file +61
-0@@ -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)scripts/link-vmlinux.sh +1
-41@@ -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
PATCH 4/4 kbuild: factor out the common objtool arguments
In reply to Masahiro Yamadascripts/Makefile.build and scripts/link-vmlinux.sh have similar setups for the objtool arguments.
It is difficult to factor out them because the vmlinux build rule is written in a shell script. It is somewhat tedious to touch the two files every time a new objtool option is supported.
To reduce the code duplication, implement everything about objtool in Makefile.
Move the objtool for vmlinux.o into scripts/Makefile.vmlinux_o.
Move the common macros to Makefile.lib so they are shared by Makefile.build and Makefile.vmlinux_o.
---
scripts/Makefile.build | 26 -------------- scripts/Makefile.lib | 26 ++++++++++++++ scripts/Makefile.vmlinux_o | 26 ++++++++++++++ scripts/link-vmlinux.sh | 71 -------------------------------------- 4 files changed, 52 insertions(+), 97 deletions(-)
scripts/Makefile.build +0 -26
@@ -210,38 +210,12 @@ cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), $(sub_cmd_record_mcount)) endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT -ifdef CONFIG_OBJTOOL - -objtool := $(objtree)/tools/objtool/objtool - -objtool_args = \ - $(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label) \ - $(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr) \ - $(if $(CONFIG_X86_KERNEL_IBT), --ibt) \ - $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \ - $(if $(CONFIG_UNWINDER_ORC), --orc) \ - $(if $(CONFIG_RETPOLINE), --retpoline) \ - $(if $(CONFIG_SLS), --sls) \ - $(if $(CONFIG_STACK_VALIDATION), --stackval) \ - $(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call) \ - --uaccess \ - $(if $(delay-objtool), --link) \ - $(if $(part-of-module), --module) \ - $(if $(CONFIG_GCOV_KERNEL), --no-unreachable) - -cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) -cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) - -endif # CONFIG_OBJTOOL - # 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory # 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file # 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file is-standard-object = $(if $(filter-out y%, $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y) -delay-objtool := $(or $(CONFIG_LTO_CLANG),$(CONFIG_X86_KERNEL_IBT)) - $(obj)/%.o: objtool-enabled = $(if $(is-standard-object),$(if $(delay-objtool),$(is-single-obj-m),y)) ifdef CONFIG_TRIM_UNUSED_KSYMS
scripts/Makefile.lib +26 -0
@@ -225,6 +225,32 @@ dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc \ $(addprefix -I,$(DTC_INCLUDE)) \ -undef -D__DTS__ +ifdef CONFIG_OBJTOOL + +objtool := $(objtree)/tools/objtool/objtool + +objtool_args = \ + $(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label) \ + $(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr) \ + $(if $(CONFIG_X86_KERNEL_IBT), --ibt) \ + $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \ + $(if $(CONFIG_UNWINDER_ORC), --orc) \ + $(if $(CONFIG_RETPOLINE), --retpoline) \ + $(if $(CONFIG_SLS), --sls) \ + $(if $(CONFIG_STACK_VALIDATION), --stackval) \ + $(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call) \ + --uaccess \ + $(if $(delay-objtool), --link) \ + $(if $(part-of-module), --module) \ + $(if $(CONFIG_GCOV_KERNEL), --no-unreachable) + +delay-objtool := $(or $(CONFIG_LTO_CLANG),$(CONFIG_X86_KERNEL_IBT)) + +cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) +cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) + +endif # CONFIG_OBJTOOL + # Useful for describing the dependency of composite objects # Usage: # $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
scripts/Makefile.vmlinux_o +26 -0
@@ -6,6 +6,9 @@ __default: vmlinux.o include include/config/auto.conf include $(srctree)/scripts/Kbuild.include +# for objtool +include $(srctree)/scripts/Makefile.lib + # Generate a linker script to ensure correct ordering of initcalls for Clang LTO # ---------------------------------------------------------------------------
@@ -24,6 +27,27 @@ ifdef CONFIG_LTO_CLANG initcalls-lds := .tmp_initcalls.lds endif +# objtool for vmlinux.o +# --------------------------------------------------------------------------- +# +# For LTO and IBT, objtool doesn't run on individual translation units. +# Run everything on vmlinux instead. + +objtool-enabled := $(or $(delay-objtool),$(CONFIG_NOINSTR_VALIDATION)) + +# Reuse objtool_args defined in scripts/Makefile.lib if LTO or IBT is enabled. +# +# Add some more flags as needed. +# --no-unreachable and --link might be added twice, but it is fine. +# +# Expand objtool_args to a simple variable to avoid circular reference. + +objtool_args := \ + $(if $(delay-objtool),$(objtool_args)) \ + $(if $(CONFIG_NOINSTR_VALIDATION), --noinstr) \ + $(if $(CONFIG_GCOV_KERNEL), --no-unreachable) \ + --link + # Link of vmlinux.o used for section mismatch analysis # ---------------------------------------------------------------------------
@@ -33,9 +57,11 @@ quiet_cmd_ld_vmlinux.o = LD $@ $(addprefix -T , $(initcalls-lds)) \ --whole-archive $(KBUILD_VMLINUX_OBJS) --no-whole-archive \ --start-group $(KBUILD_VMLINUX_LIBS) --end-group \ + $(cmd_objtool) define rule_ld_vmlinux.o $(call cmd_and_savecmd,ld_vmlinux.o) + $(call cmd,gen_objtooldep) endef vmlinux.o: $(initcalls-lds) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
scripts/link-vmlinux.sh +0 -71
83 lines not on this page · raw message
Signature · 1 line
2.32.0
Re: [PATCH 4/4] kbuild: factor out the common objtool arguments
Quoted 11 lines · Masahiro Yamada
scripts/Makefile.buildandscripts/link-vmlinux.shhave similar setups for the objtool arguments.It is difficult to factor out them because the vmlinux build rule is written in a shell script. It is somewhat tedious to touch the two files every time a new objtool option is supported.
To reduce the code duplication, implement everything about objtool in
Makefile.
Quoted 6 lines
Move the objtool for vmlinux.o into
scripts/Makefile.vmlinux_o.Move the common macros to Makefile.lib so they are shared by Makefile.build and Makefile.vmlinux_o.
Signed-off-by Masahiro Yamada <[email protected]>
With some comments (see below).
-Sedat-
Quoted 34 lines
---
scripts/Makefile.build | 26 -------------- scripts/Makefile.lib | 26 ++++++++++++++ scripts/Makefile.vmlinux_o | 26 ++++++++++++++ scripts/link-vmlinux.sh | 71 -------------------------------------- 4 files changed, 52 insertions(+), 97 deletions(-)scripts/Makefile.build +0
-18@@ -210,38 +210,12 @@ cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), $(sub_cmd_record_mcount)) endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT -ifdef CONFIG_OBJTOOL - -objtool := $(objtree)/tools/objtool/objtool - -objtool_args = \ - $(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label) \ - $(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr) \ - $(if $(CONFIG_X86_KERNEL_IBT), --ibt) \ - $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \ - $(if $(CONFIG_UNWINDER_ORC), --orc) \ - $(if $(CONFIG_RETPOLINE), --retpoline) \ - $(if $(CONFIG_SLS), --sls) \ - $(if $(CONFIG_STACK_VALIDATION), --stackval) \ - $(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call) \ - --uaccess \ - $(if $(delay-objtool), --link) \ - $(if $(part-of-module), --module) \ - $(if $(CONFIG_GCOV_KERNEL), --no-unreachable)
scripts/Makefile.build cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), · line 216
Quoted 10 lines
scripts/Makefile.build +0
-6- -cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) -cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) - -endif # CONFIG_OBJTOOL - # 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory # 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file # 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
^^ What is with this block?
If this belongs together with objtool - shall this be moved, too?
Quoted 180 lines
scripts/Makefile.build +0
-2is-standard-object = $(if $(filter-out y%, $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y) -delay-objtool := $(or $(CONFIG_LTO_CLANG),$(CONFIG_X86_KERNEL_IBT)) - $(obj)/%.o: objtool-enabled = $(if $(is-standard-object),$(if $(delay-objtool),$(is-single-obj-m),y)) ifdef CONFIG_TRIM_UNUSED_KSYMSscripts/Makefile.lib +26
-0@@ -225,6 +225,32 @@ dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc \ $(addprefix -I,$(DTC_INCLUDE)) \ -undef -D__DTS__ +ifdef CONFIG_OBJTOOL + +objtool := $(objtree)/tools/objtool/objtool + +objtool_args = \ + $(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label) \ + $(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr) \ + $(if $(CONFIG_X86_KERNEL_IBT), --ibt) \ + $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \ + $(if $(CONFIG_UNWINDER_ORC), --orc) \ + $(if $(CONFIG_RETPOLINE), --retpoline) \ + $(if $(CONFIG_SLS), --sls) \ + $(if $(CONFIG_STACK_VALIDATION), --stackval) \ + $(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call) \ + --uaccess \ + $(if $(delay-objtool), --link) \ + $(if $(part-of-module), --module) \ + $(if $(CONFIG_GCOV_KERNEL), --no-unreachable) + +delay-objtool := $(or $(CONFIG_LTO_CLANG),$(CONFIG_X86_KERNEL_IBT)) + +cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) +cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) + +endif # CONFIG_OBJTOOL + # Useful for describing the dependency of composite objects # Usage: # $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)scripts/Makefile.vmlinux_o +26
-0@@ -6,6 +6,9 @@ __default: vmlinux.o include include/config/auto.conf include $(srctree)/scripts/Kbuild.include +# for objtool +include $(srctree)/scripts/Makefile.lib + # Generate a linker script to ensure correct ordering of initcalls for Clang LTO # ---------------------------------------------------------------------------@@ -24,6 +27,27 @@ ifdef CONFIG_LTO_CLANG initcalls-lds := .tmp_initcalls.lds endif +# objtool for vmlinux.o +# --------------------------------------------------------------------------- +# +# For LTO and IBT, objtool doesn't run on individual translation units. +# Run everything on vmlinux instead. + +objtool-enabled := $(or $(delay-objtool),$(CONFIG_NOINSTR_VALIDATION)) + +# Reuse objtool_args defined in scripts/Makefile.lib if LTO or IBT is enabled. +# +# Add some more flags as needed. +# --no-unreachable and --link might be added twice, but it is fine. +# +# Expand objtool_args to a simple variable to avoid circular reference. + +objtool_args := \ + $(if $(delay-objtool),$(objtool_args)) \ + $(if $(CONFIG_NOINSTR_VALIDATION), --noinstr) \ + $(if $(CONFIG_GCOV_KERNEL), --no-unreachable) \ + --link + # Link of vmlinux.o used for section mismatch analysis # ---------------------------------------------------------------------------@@ -33,9 +57,11 @@ quiet_cmd_ld_vmlinux.o = LD $@ $(addprefix -T , $(initcalls-lds)) \ --whole-archive $(KBUILD_VMLINUX_OBJS) --no-whole-archive \ --start-group $(KBUILD_VMLINUX_LIBS) --end-group \ + $(cmd_objtool) define rule_ld_vmlinux.o $(call cmd_and_savecmd,ld_vmlinux.o) + $(call cmd,gen_objtooldep) endef vmlinux.o: $(initcalls-lds) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCEscripts/link-vmlinux.sh +0
-70@@ -45,76 +45,6 @@ info() printf " %-7s %s\n" "${1}" "${2}" } -objtool_link() -{ - local objtoolcmd; - local objtoolopt; - - if ! is_enabled CONFIG_OBJTOOL; then - return; - fi - - if is_enabled CONFIG_LTO_CLANG || is_enabled CONFIG_X86_KERNEL_IBT; then - - # For LTO and IBT, objtool doesn't run on individual - # translation units. Run everything on vmlinux instead. - - if is_enabled CONFIG_HAVE_JUMP_LABEL_HACK; then - objtoolopt="${objtoolopt} --hacks=jump_label" - fi - - if is_enabled CONFIG_HAVE_NOINSTR_HACK; then - objtoolopt="${objtoolopt} --hacks=noinstr" - fi - - if is_enabled CONFIG_X86_KERNEL_IBT; then - objtoolopt="${objtoolopt} --ibt" - fi - - if is_enabled CONFIG_FTRACE_MCOUNT_USE_OBJTOOL; then - objtoolopt="${objtoolopt} --mcount" - fi - - if is_enabled CONFIG_UNWINDER_ORC; then - objtoolopt="${objtoolopt} --orc" - fi - - if is_enabled CONFIG_RETPOLINE; then - objtoolopt="${objtoolopt} --retpoline" - fi - - if is_enabled CONFIG_SLS; then - objtoolopt="${objtoolopt} --sls" - fi - - if is_enabled CONFIG_STACK_VALIDATION; then - objtoolopt="${objtoolopt} --stackval" - fi - - if is_enabled CONFIG_HAVE_STATIC_CALL_INLINE; then - objtoolopt="${objtoolopt} --static-call" - fi - - objtoolopt="${objtoolopt} --uaccess" - fi - - if is_enabled CONFIG_NOINSTR_VALIDATION; then - objtoolopt="${objtoolopt} --noinstr" - fi - - if [ -n "${objtoolopt}" ]; then - - if is_enabled CONFIG_GCOV_KERNEL; then - objtoolopt="${objtoolopt} --no-unreachable" - fi - - objtoolopt="${objtoolopt} --link" - - info OBJTOOL ${1} - tools/objtool/objtool ${objtoolopt} ${1} - fi -} - # Link of vmlinux # ${1} - output file # ${2}, ${3}, ... - optional extra .o files
scripts/link-vmlinux.sh ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 · line 229
Quoted 2 lines
scripts/link-vmlinux.sh +0
-0@@ -298,7 +228,6 @@ ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 #link vmlinux.o
^^ While you are at it, change the comment to "# Link of vmlinux.o".
Quoted 8 lines
scripts/link-vmlinux.sh +0
-2${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o" -objtool_link vmlinux.o # Generate the list of objects in vmlinux for f in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do --2.32.0
Re: [PATCH 4/4] kbuild: factor out the common objtool arguments
Quoted 65 lines · Sedat Dilek
Quoted 11 lines · Masahiro Yamada
scripts/Makefile.buildandscripts/link-vmlinux.shhave similar setups for the objtool arguments.It is difficult to factor out them because the vmlinux build rule is written in a shell script. It is somewhat tedious to touch the two files every time a new objtool option is supported.
To reduce the code duplication, implement everything about objtool in
Makefile.Quoted 6 lines
Move the objtool for vmlinux.o into
scripts/Makefile.vmlinux_o.Move the common macros to Makefile.lib so they are shared by Makefile.build and Makefile.vmlinux_o.
Signed-off-by Masahiro Yamada <[email protected]>With some comments (see below).
-Sedat-
Quoted 39 lines
---
scripts/Makefile.build | 26 -------------- scripts/Makefile.lib | 26 ++++++++++++++ scripts/Makefile.vmlinux_o | 26 ++++++++++++++ scripts/link-vmlinux.sh | 71 -------------------------------------- 4 files changed, 52 insertions(+), 97 deletions(-)scripts/Makefile.build +0
-23@@ -210,38 +210,12 @@ cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), $(sub_cmd_record_mcount)) endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT -ifdef CONFIG_OBJTOOL - -objtool := $(objtree)/tools/objtool/objtool - -objtool_args = \ - $(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label) \ - $(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr) \ - $(if $(CONFIG_X86_KERNEL_IBT), --ibt) \ - $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \ - $(if $(CONFIG_UNWINDER_ORC), --orc) \ - $(if $(CONFIG_RETPOLINE), --retpoline) \ - $(if $(CONFIG_SLS), --sls) \ - $(if $(CONFIG_STACK_VALIDATION), --stackval) \ - $(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call) \ - --uaccess \ - $(if $(delay-objtool), --link) \ - $(if $(part-of-module), --module) \ - $(if $(CONFIG_GCOV_KERNEL), --no-unreachable) - -cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) -cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) - -endif # CONFIG_OBJTOOL
Quoted 8 lines
scripts/Makefile.build cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), · line 216
Quoted 5 lines
scripts/Makefile.build +0
-1- # 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory # 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file # 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file^^ What is with this block?
If this belongs together with objtool - shall this be moved, too?
No.
These are unneeded for vmlinux.o
Quoted 11 lines
scripts/Makefile.build ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 · line 229
Quoted 9 lines
scripts/Makefile.build +0
-3- fi -} - # Link of vmlinux # ${1} - output file # ${2}, ${3}, ... - optional extra .o files@@ -298,7 +228,6 @@ ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 #link vmlinux.o^^ While you are at it, change the comment to "# Link of vmlinux.o".
In my plan, this code will be gone sooner or later.
It would be a noise.
Signature · 2 lines
Best Regards Masahiro Yamada
Re: [PATCH 4/4] kbuild: factor out the common objtool arguments
On Sun, May 29, 2022 at 7:36 PM Masahiro Yamada <[email protected]> wrote:
...
Quoted 11 lines
Quoted 7 lines
Quoted 4 lines
# '
OBJECT_FILES_NON_STANDARD:= y': skip objtool checking for a directory # 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file # 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file^^ What is with this block?
If this belongs together with objtool - shall this be moved, too?No.
These are unneeded for vmlinux.o
OK.
Quoted 9 lines
Quoted 3 lines
Quoted 1 line
#link vmlinux.o
^^ While you are at it, change the comment to "# Link of vmlinux.o".
In my plan, this code will be gone sooner or later.
It would be a noise.
Hope you have fruitful plans :-).
-sed@-
Quoted 7 lines · Masahiro Yamada
These are cleaned by the top
Makefile.vmlinux.o and .vmlinux.d matches the '*.[aios]' and '.*.d' patterns respectively.
Signed-off-by Masahiro Yamada <[email protected]>
I applied this patchset on top of yesterday's kbuild.git#for-next (today's did not fit due to "kbuild: do not try to parse *.cmd files for objects provided by compiler").
Might be related to this patchset or not:
$ LC_ALL=C ll .*vmlinux*export* -rw-r--r-- 1 dileks dileks 4.2K May 29 15:11 ..vmlinux.export.o.cmd -rw-r--r-- 1 dileks dileks 508K May 29 15:11 .vmlinux.export.c -rw-r--r-- 1 dileks dileks 2.6M May 29 15:11 .vmlinux.export.o
You see the leading double-dot for ..vmlinux.export.o.cmd - intended or not?
-Sedat-
Quoted 21 lines
---
scripts/link-vmlinux.sh | 2 -- 1 file changed, 2 deletions(-)scripts/link-vmlinux.sh +0
-3@@ -309,8 +309,6 @@ cleanup() rm -f System.map rm -f vmlinux rm -f vmlinux.map - rm -f vmlinux.o - rm -f .vmlinux.d rm -f .vmlinux.objs rm -f .vmlinux.export.c } --2.32.0
Quoted 21 lines · Sedat Dilek
Quoted 7 lines · Masahiro Yamada
These are cleaned by the top
Makefile.vmlinux.o and .vmlinux.d matches the '*.[aios]' and '.*.d' patterns respectively.
Signed-off-by Masahiro Yamada <[email protected]>I applied this patchset on top of yesterday's kbuild.git#for-next (today's did not fit due to "kbuild: do not try to parse *.cmd files for objects provided by compiler").
Might be related to this patchset or not:
$ LC_ALL=C ll .*vmlinux*export*(quoted diff) +0
-3-rw-r--r-- 1 dileks dileks 4.2K May 29 15:11 ..vmlinux.export.o.cmd -rw-r--r-- 1 dileks dileks 508K May 29 15:11 .vmlinux.export.c -rw-r--r-- 1 dileks dileks 2.6M May 29 15:11 .vmlinux.export.o
Quoted 1 line
You see the leading double-dot for ..vmlinux.export.o.cmd - intended or not?
This is intended.
The source file (.vmlinux.export.c) is a dot file.
.*.cmd prepends one more dot.
Quoted 26 lines
-Sedat-
Quoted 21 lines
---
scripts/link-vmlinux.sh | 2 -- 1 file changed, 2 deletions(-)scripts/link-vmlinux.sh +0
-3@@ -309,8 +309,6 @@ cleanup() rm -f System.map rm -f vmlinux rm -f vmlinux.map - rm -f vmlinux.o - rm -f .vmlinux.d rm -f .vmlinux.objs rm -f .vmlinux.export.c } --2.32.0
Signature · 2 lines
Best Regards Masahiro Yamada
On Sun, May 29, 2022 at 7:32 PM Masahiro Yamada <[email protected]> wrote:
...
Quoted 7 lines
Quoted 7 lines
Might be related to this patchset or not:
$ LC_ALL=C ll .*vmlinux*export*(quoted diff) +0
-3-rw-r--r-- 1 dileks dileks 4.2K May 29 15:11 ..vmlinux.export.o.cmd -rw-r--r-- 1 dileks dileks 508K May 29 15:11 .vmlinux.export.c -rw-r--r-- 1 dileks dileks 2.6M May 29 15:11 .vmlinux.export.o
Quoted 8 lines
Quoted 1 line
You see the leading double-dot for ..vmlinux.export.o.cmd - intended or not?
This is intended.
The source file (
.vmlinux.export.c) is a dot file..*.cmd prepends one more dot.
Fine with me.
-sed@-