kbuild: do section mismatch check on full vmlinux
Previously we did do the check on the .o files used to link vmlinux but that failed to find questionable references across the .o files. Create a dedicated vmlinux.o file used only for section mismatch checks that uses the defualt linker script so section does not get renamed. The vmlinux.o may later be used as part of the the final link of vmlinux but for now it is used fo section mismatch only. For a defconfig build this is instant but for an allyesconfig this add two minutes to a full build (that anyways takes ~2 hours). Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
Родитель
1e29a706ee
Коммит
741f98fe29
22
Makefile
22
Makefile
|
@ -612,7 +612,7 @@ quiet_cmd_vmlinux__ ?= LD $@
|
|||
cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
|
||||
-T $(vmlinux-lds) $(vmlinux-init) \
|
||||
--start-group $(vmlinux-main) --end-group \
|
||||
$(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
|
||||
$(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^)
|
||||
|
||||
# Generate new vmlinux version
|
||||
quiet_cmd_vmlinux_version = GEN .version
|
||||
|
@ -736,15 +736,31 @@ debug_kallsyms: .tmp_map$(last_kallsyms)
|
|||
|
||||
endif # ifdef CONFIG_KALLSYMS
|
||||
|
||||
# Do modpost on a prelinked vmlinux. The finally linked vmlinux has
|
||||
# relevant sections renamed as per the linker script.
|
||||
quiet_cmd_vmlinux-modpost = LD $@
|
||||
cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
|
||||
$(vmlinux-init) --start-group $(vmlinux-main) --end-group \
|
||||
$(filter-out $(vmlinux-init) $(vmlinux-main) $(vmlinux-lds) FORCE ,$^)
|
||||
define rule_vmlinux-modpost
|
||||
:
|
||||
+$(call cmd,vmlinux-modpost)
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
|
||||
$(Q)echo 'cmd_$@ := $(cmd_vmlinux-modpost)' > $(dot-target).cmd
|
||||
endef
|
||||
|
||||
# vmlinux image - including updated kernel symbols
|
||||
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
|
||||
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) vmlinux.o FORCE
|
||||
ifdef CONFIG_HEADERS_CHECK
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
|
||||
endif
|
||||
$(call vmlinux-modpost)
|
||||
$(call if_changed_rule,vmlinux__)
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
|
||||
$(Q)rm -f .old_version
|
||||
|
||||
vmlinux.o: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
|
||||
$(call if_changed_rule,vmlinux-modpost)
|
||||
|
||||
# The actual objects are generated when descending,
|
||||
# make sure no implicit rule kicks in
|
||||
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
|
||||
|
|
|
@ -70,10 +70,10 @@ __modpost: $(modules:.ko=.o) FORCE
|
|||
$(call cmd,modpost) $(wildcard vmlinux) $(filter-out FORCE,$^)
|
||||
|
||||
quiet_cmd_kernel-mod = MODPOST $@
|
||||
cmd_kernel-mod = $(cmd_modpost) $(KBUILD_VMLINUX_OBJS)
|
||||
cmd_kernel-mod = $(cmd_modpost) $@
|
||||
|
||||
PHONY += vmlinux
|
||||
vmlinux: FORCE
|
||||
vmlinux.o: FORCE
|
||||
$(call cmd,kernel-mod)
|
||||
|
||||
# Declare generated files as targets for modpost
|
||||
|
|
|
@ -75,7 +75,8 @@ static int is_vmlinux(const char *modname)
|
|||
else
|
||||
myname = modname;
|
||||
|
||||
return strcmp(myname, "vmlinux") == 0;
|
||||
return (strcmp(myname, "vmlinux") == 0) ||
|
||||
(strcmp(myname, "vmlinux.o") == 0);
|
||||
}
|
||||
|
||||
void *do_nofail(void *ptr, const char *expr)
|
||||
|
|
Загрузка…
Ссылка в новой задаче