Re: [RFC PATCH v4 11/17] kbuild: Add generic hook for architectures to use before the final vmlinux link
From: "Nicholas Piggin" <npiggin@gmail.com>
Date: 2024-07-15 07:30:04
Also in:
bpf, linux-kbuild, linuxppc-dev, lkml
On Sun Jul 14, 2024 at 6:27 PM AEST, Naveen N Rao wrote:
On powerpc, we would like to be able to make a pass on vmlinux.o and generate a new object file to be linked into vmlinux. Add a generic pass in Makefile.vmlinux that architectures can use for this purpose. Architectures need to select CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX and must provide arch/<arch>/tools/Makefile with .arch.vmlinux.o target, which will be invoked prior to the final vmlinux link step.
Maybe POSTLINK should move to more like this with explicit config option too rather than just picking up Makefile.postlink...
quoted hunk ↗ jump to hunk
Signed-off-by: Naveen N Rao <naveen@kernel.org> --- arch/Kconfig | 6 ++++++ scripts/Makefile.vmlinux | 8 ++++++++ scripts/link-vmlinux.sh | 11 ++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-)diff --git a/arch/Kconfig b/arch/Kconfig index 975dd22a2dbd..ef868ff8156a 100644 --- a/arch/Kconfig +++ b/arch/Kconfig@@ -1643,4 +1643,10 @@ config CC_HAS_SANE_FUNCTION_ALIGNMENT config ARCH_NEED_CMPXCHG_1_EMU bool +config ARCH_WANTS_PRE_LINK_VMLINUX + def_bool n + help + An architecture can select this if it provides arch/<arch>/tools/Makefile + with .arch.vmlinux.o target to be linked into vmlinux.
Someone bikeshedded me before for putting comments for putting comment for non-user-selectable option in 'help'. Even though heaps of options are like that here, apparently they preferred # comment above the option for developer comments. I personally thought this looks nicer but do Kconfig maintainers prefer #?
quoted hunk ↗ jump to hunk
+ endmenudiff --git a/scripts/Makefile.vmlinux b/scripts/Makefile.vmlinux index 49946cb96844..6410e0be7f52 100644 --- a/scripts/Makefile.vmlinux +++ b/scripts/Makefile.vmlinux@@ -22,6 +22,14 @@ targets += .vmlinux.export.o vmlinux: .vmlinux.export.o endif +ifdef CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX +targets += .arch.vmlinux.o +.arch.vmlinux.o: vmlinux.o FORCE + $(Q)$(MAKE) $(build)=arch/$(SRCARCH)/tools .arch.vmlinux.o + +vmlinux: .arch.vmlinux.o +endif
Does .vmlinux.arch.o follow convention better? I guess the btf does not. So, nevermind. Could this just be done entirely in link-vmlinux.sh like kallsyms and btf?
quoted hunk ↗ jump to hunk
+ ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink) # Final link of vmlinux with optional arch pass after final linkdiff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index 518c70b8db50..aafaed1412ea 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh@@ -122,7 +122,7 @@ gen_btf() return 1 fi - vmlinux_link ${1} + vmlinux_link ${1} ${arch_vmlinux_o} info "BTF" ${2} LLVM_OBJCOPY="${OBJCOPY}" ${PAHOLE} -J ${PAHOLE_FLAGS} ${1}
BTF generation needs the prelink .o?
quoted hunk ↗ jump to hunk
@@ -178,7 +178,7 @@ kallsyms_step() kallsymso=${kallsyms_vmlinux}.o kallsyms_S=${kallsyms_vmlinux}.S - vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o} + vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o} ${arch_vmlinux_o} mksysmap ${kallsyms_vmlinux} ${kallsyms_vmlinux}.syms kallsyms ${kallsyms_vmlinux}.syms ${kallsyms_S}
quoted hunk ↗ jump to hunk
@@ -223,6 +223,11 @@ fi ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init init/version-timestamp.o +arch_vmlinux_o="" +if is_enabled CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX; then + arch_vmlinux_o=.arch.vmlinux.o +fi + btf_vmlinux_bin_o="" if is_enabled CONFIG_DEBUG_INFO_BTF; then btf_vmlinux_bin_o=.btf.vmlinux.bin.o@@ -273,7 +278,7 @@ if is_enabled CONFIG_KALLSYMS; then fi fi -vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o} +vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o} ${arch_vmlinux_o} # fill in BTF IDs if is_enabled CONFIG_DEBUG_INFO_BTF && is_enabled CONFIG_BPF; then
I guess it looks okay, similar to btf although I'm not a kbuild expert. Thanks, Nick