Skip to contentSkip to conversation

kbuild: remove redundant cleanups in scripts/link-vmlinux.sh

PATCH In review Masahiro Yamada 3 participants 16 messages May 28, 2022 – Jun 3, 2022 Kbuild

lore
Share & tools
lore
#0 lore raw

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
index a7f6196c7e41..844fc0125d72 100755
@@ -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
#1 lore raw

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
index edc3f44cd96c..7011d43dff35 100644
@@ -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
index 844fc0125d72..b593cb1a8137 100755
@@ -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
index 72b0b63c3fe1..68b8d74e5c6f 100755
@@ -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
Tested-by on v1 2/4
#2 lore raw

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".

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
index edc3f44cd96c..7011d43dff35 100644
@@ -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
index 844fc0125d72..b593cb1a8137 100755
@@ -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 -2
index 72b0b63c3fe1..68b8d74e5c6f 100755
@@ -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

#3 lore raw

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".

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
index edc3f44cd96c..7011d43dff35 100644
@@ -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
index 844fc0125d72..b593cb1a8137 100755
@@ -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 -2
index 72b0b63c3fe1..68b8d74e5c6f 100755
@@ -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
#4 lore raw

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@-

#5 lore raw

Re: [PATCH 2/4] kbuild: clean .tmp_* pattern by make clean

In reply to Masahiro Yamada
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".

---

 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
index 72b0b63c3fe1..68b8d74e5c6f 100755
@@ -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).

#6 lore raw

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".

---

 Makefile                | 4 ++--
 scripts/link-vmlinux.sh | 3 ---
 scripts/objdiff         | 2 +-
 3 files changed, 3 insertions(+), 6 deletions(-)

...

Quoted 8 lines
scripts/objdiff +0 -0
index 72b0b63c3fe1..68b8d74e5c6f 100755
@@ -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/objdiff still 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
#7 lore raw

PATCH 3/4 kbuild: move vmlinux.o link to scripts/Makefile.vmlinux_o

In reply to Masahiro Yamada

This 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
new file mode 100644
index 000000000000..a9b375ca86d5
@@ -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
Tested-by on v1 3/4
#8 lore raw

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.

-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_o
scripts/Makefile.vmlinux_o new file +61 -0
new file mode 100644
index 000000000000..a9b375ca86d5
@@ -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
index b593cb1a8137..90680b6bd710 100755
@@ -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

#9 lore raw

PATCH 4/4 kbuild: factor out the common objtool arguments

In reply to Masahiro Yamada

scripts/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
index 4cb7145071b9..1f01ac65c0cd 100644
@@ -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
index f75138385449..f691fb231ce5 100644
@@ -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
index a9b375ca86d5..3c97a1564947 100644
@@ -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
Tested-by on v1 4/4
#10 lore raw

Re: [PATCH 4/4] kbuild: factor out the common objtool arguments

Quoted 11 lines · Masahiro Yamada

scripts/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.

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.

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
index 4cb7145071b9..1f01ac65c0cd 100644
@@ -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 -2
 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
index f75138385449..f691fb231ce5 100644
@@ -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
index a9b375ca86d5..3c97a1564947 100644
@@ -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 -70
index 90680b6bd710..1ac4e180fa3f 100755
@@ -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

#11 lore raw

Re: [PATCH 4/4] kbuild: factor out the common objtool arguments

Quoted 65 lines · Sedat Dilek
Quoted 11 lines · Masahiro Yamada

scripts/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.

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.

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
index 4cb7145071b9..1f01ac65c0cd 100644
@@ -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
#12 lore raw

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@-

Tested-by on v1 1/4
#13 lore raw
In reply to Masahiro Yamada
Quoted 7 lines · Masahiro Yamada

These are cleaned by the top Makefile.

vmlinux.o and .vmlinux.d matches the '*.[aios]' and '.*.d' patterns respectively.

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
index a7f6196c7e41..844fc0125d72 100755
@@ -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

#14 lore raw
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.

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
index a7f6196c7e41..844fc0125d72 100755
@@ -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
#15 lore raw

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@-