mirror of
https://github.com/torvalds/linux.git
synced 2025-11-02 09:40:27 +02:00
Since .vmlinux.export.c is used to add generated by modpost modaliases for builtin modules the .vmlinux.export.o is no longer optional and should always be created. The generation of this file is not dependent on CONFIG_MODULES. Signed-off-by: Alexey Gladkov <legion@kernel.org> Reviewed-by: Nicolas Schier <nsc@kernel.org> Link: https://patch.msgid.link/0e63a9c7741fe8217e4fd7c60afcf057ffa2ef5a.1758182101.git.legion@kernel.org Signed-off-by: Nathan Chancellor <nathan@kernel.org>
158 lines
4.9 KiB
Text
158 lines
4.9 KiB
Text
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
PHONY := __default
|
|
__default: vmlinux
|
|
|
|
include include/config/auto.conf
|
|
include $(srctree)/scripts/Kbuild.include
|
|
include $(srctree)/scripts/Makefile.lib
|
|
|
|
targets :=
|
|
|
|
%.o: %.c FORCE
|
|
$(call if_changed_rule,cc_o_c)
|
|
|
|
%.o: %.S FORCE
|
|
$(call if_changed_rule,as_o_S)
|
|
|
|
# Built-in dtb
|
|
# ---------------------------------------------------------------------------
|
|
|
|
quiet_cmd_wrap_dtbs = WRAP $@
|
|
cmd_wrap_dtbs = { \
|
|
echo '\#include <asm-generic/vmlinux.lds.h>'; \
|
|
echo '.section .dtb.init.rodata,"a"'; \
|
|
while read dtb; do \
|
|
symbase=__dtb_$$(basename -s .dtb "$${dtb}" | tr - _); \
|
|
echo '.balign STRUCT_ALIGNMENT'; \
|
|
echo ".global $${symbase}_begin"; \
|
|
echo "$${symbase}_begin:"; \
|
|
echo '.incbin "'$$dtb'" '; \
|
|
echo ".global $${symbase}_end"; \
|
|
echo "$${symbase}_end:"; \
|
|
done < $<; \
|
|
} > $@
|
|
|
|
.builtin-dtbs.S: .builtin-dtbs-list FORCE
|
|
$(call if_changed,wrap_dtbs)
|
|
|
|
quiet_cmd_gen_dtbs_list = GEN $@
|
|
cmd_gen_dtbs_list = \
|
|
$(if $(CONFIG_BUILTIN_DTB_NAME), echo "arch/$(SRCARCH)/boot/dts/$(CONFIG_BUILTIN_DTB_NAME).dtb",:) > $@
|
|
|
|
.builtin-dtbs-list: arch/$(SRCARCH)/boot/dts/dtbs-list FORCE
|
|
$(call if_changed,$(if $(CONFIG_BUILTIN_DTB_ALL),copy,gen_dtbs_list))
|
|
|
|
targets += .builtin-dtbs-list
|
|
|
|
ifdef CONFIG_GENERIC_BUILTIN_DTB
|
|
targets += .builtin-dtbs.S .builtin-dtbs.o
|
|
vmlinux.unstripped: .builtin-dtbs.o
|
|
endif
|
|
|
|
# vmlinux.unstripped
|
|
# ---------------------------------------------------------------------------
|
|
|
|
ifdef CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX
|
|
vmlinux.unstripped: arch/$(SRCARCH)/tools/vmlinux.arch.o
|
|
|
|
arch/$(SRCARCH)/tools/vmlinux.arch.o: vmlinux.o FORCE
|
|
$(Q)$(MAKE) $(build)=arch/$(SRCARCH)/tools $@
|
|
endif
|
|
|
|
ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
|
|
|
|
# Final link of vmlinux with optional arch pass after final link
|
|
cmd_link_vmlinux = \
|
|
$< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)" "$@"; \
|
|
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
|
|
|
|
targets += vmlinux.unstripped .vmlinux.export.o
|
|
vmlinux.unstripped: scripts/link-vmlinux.sh vmlinux.o .vmlinux.export.o $(KBUILD_LDS) FORCE
|
|
+$(call if_changed_dep,link_vmlinux)
|
|
ifdef CONFIG_DEBUG_INFO_BTF
|
|
vmlinux.unstripped: $(RESOLVE_BTFIDS)
|
|
endif
|
|
|
|
ifdef CONFIG_BUILDTIME_TABLE_SORT
|
|
vmlinux.unstripped: scripts/sorttable
|
|
endif
|
|
|
|
# vmlinux
|
|
# ---------------------------------------------------------------------------
|
|
|
|
remove-section-y := .modinfo
|
|
remove-section-$(CONFIG_ARCH_VMLINUX_NEEDS_RELOCS) += '.rel*'
|
|
|
|
remove-symbols := -w --strip-symbol='__mod_device_table__*'
|
|
|
|
# To avoid warnings: "empty loadable segment detected at ..." from GNU objcopy,
|
|
# it is necessary to remove the PT_LOAD flag from the segment.
|
|
quiet_cmd_strip_relocs = OBJCOPY $@
|
|
cmd_strip_relocs = $(OBJCOPY) $(patsubst %,--set-section-flags %=noload,$(remove-section-y)) $< $@; \
|
|
$(OBJCOPY) $(addprefix --remove-section=,$(remove-section-y)) $(remove-symbols) $@
|
|
|
|
targets += vmlinux
|
|
vmlinux: vmlinux.unstripped FORCE
|
|
$(call if_changed,strip_relocs)
|
|
|
|
# modules.builtin.modinfo
|
|
# ---------------------------------------------------------------------------
|
|
|
|
OBJCOPYFLAGS_modules.builtin.modinfo := -j .modinfo -O binary
|
|
|
|
targets += modules.builtin.modinfo
|
|
modules.builtin.modinfo: vmlinux.unstripped FORCE
|
|
$(call if_changed,objcopy)
|
|
|
|
# modules.builtin
|
|
# ---------------------------------------------------------------------------
|
|
|
|
__default: modules.builtin
|
|
|
|
# The second line aids cases where multiple modules share the same object.
|
|
|
|
quiet_cmd_modules_builtin = GEN $@
|
|
cmd_modules_builtin = \
|
|
tr '\0' '\n' < $< | \
|
|
sed -n 's/^[[:alnum:]:_]*\.file=//p' | \
|
|
tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$$/.ko/' > $@
|
|
|
|
targets += modules.builtin
|
|
modules.builtin: modules.builtin.modinfo FORCE
|
|
$(call if_changed,modules_builtin)
|
|
|
|
# modules.builtin.ranges
|
|
# ---------------------------------------------------------------------------
|
|
ifdef CONFIG_BUILTIN_MODULE_RANGES
|
|
__default: modules.builtin.ranges
|
|
|
|
quiet_cmd_modules_builtin_ranges = GEN $@
|
|
cmd_modules_builtin_ranges = gawk -f $(real-prereqs) > $@
|
|
|
|
targets += modules.builtin.ranges
|
|
modules.builtin.ranges: $(srctree)/scripts/generate_builtin_ranges.awk \
|
|
modules.builtin vmlinux.map vmlinux.o.map FORCE
|
|
$(call if_changed,modules_builtin_ranges)
|
|
|
|
vmlinux.map: vmlinux.unstripped
|
|
@:
|
|
|
|
endif
|
|
|
|
# Add FORCE to the prerequisites 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)
|