Commit 8cc7a297 authored by Kai Germaschewski's avatar Kai Germaschewski

kbuild: Generalize adding of additional sections to vmlinux

kallsyms needs to actually have a final vmlinux to extract the symbols,
and then add this information as a new section to the final vmlinux.

Currently, we basically just do the vmlinux link twice, adding
.tmp_kallsyms.o the second time. However, it's actually possible to just
link together the temporary vmlinux generated the first time and the
new object file directly without going back to all the single parts
that the temporary vmlinux was linked from.

This mechanism should be useful for sparc as well, where the btfix
mechanism needs an already linked vmlinux, too.

IMPORTANT: This does only work as desired if the link script can be
used recursively, i.e.

ld <flags> -T arch/$(ARCH)/vmlinux.lds.s -o vmlinux.test vmlinux

generates a vmlinux.test which is identical to vmlinux.
arch/i386/vmlinux.lds.S needed a little tweaking, so probably the
other archs do as well.
parent 91990be9
...@@ -285,8 +285,8 @@ export MODLIB ...@@ -285,8 +285,8 @@ export MODLIB
vmlinux-objs := $(HEAD) $(init-y) $(core-y) $(libs-y) $(drivers-y) $(net-y) vmlinux-objs := $(HEAD) $(init-y) $(core-y) $(libs-y) $(drivers-y) $(net-y)
quiet_cmd_link_vmlinux = LD $@ quiet_cmd_ld_tmp_vmlinux = LD $@
define cmd_link_vmlinux define cmd_ld_tmp_vmlinux
$(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) $(HEAD) $(init-y) \ $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) $(HEAD) $(init-y) \
--start-group \ --start-group \
$(core-y) \ $(core-y) \
...@@ -294,21 +294,19 @@ define cmd_link_vmlinux ...@@ -294,21 +294,19 @@ define cmd_link_vmlinux
$(drivers-y) \ $(drivers-y) \
$(net-y) \ $(net-y) \
--end-group \ --end-group \
$(filter $(kallsyms.o),$^) \
-o $@ -o $@
endef endef
# set -e makes the rule exit immediately on error # set -e makes the rule exit immediately on error
define rule_vmlinux define rule_ld_tmp_vmlinux
set -e set -e
echo ' Generating build number' echo ' Generating build number'
. scripts/mkversion > .tmp_version . scripts/mkversion > .tmp_version
mv -f .tmp_version .version mv -f .tmp_version .version
+$(call descend,init,) +$(call descend,init,)
$(call cmd,link_vmlinux) $(call cmd,ld_tmp_vmlinux)
echo 'cmd_$@ := $(cmd_link_vmlinux)' > $(@D)/.$(@F).cmd echo 'cmd_$@ := $(cmd_ld_tmp_vmlinux)' > $(@D)/.$(@F).cmd
$(NM) $@ | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
endef endef
LDFLAGS_vmlinux += -T arch/$(ARCH)/vmlinux.lds.s LDFLAGS_vmlinux += -T arch/$(ARCH)/vmlinux.lds.s
...@@ -317,33 +315,42 @@ LDFLAGS_vmlinux += -T arch/$(ARCH)/vmlinux.lds.s ...@@ -317,33 +315,42 @@ LDFLAGS_vmlinux += -T arch/$(ARCH)/vmlinux.lds.s
ifdef CONFIG_KALLSYMS ifdef CONFIG_KALLSYMS
kallsyms.o := .tmp_kallsyms.o final-objs += .tmp_kallsyms.o
quiet_cmd_kallsyms = KSYM $@ quiet_cmd_kallsyms = KSYM $@
cmd_kallsyms = $(KALLSYMS) $< > $@ define cmd_kallsyms
$(KALLSYMS) $< > $@
endef
.tmp_kallsyms.o: .tmp_vmlinux .tmp_kallsyms.o: .tmp_vmlinux
$(call cmd,kallsyms) $(call cmd,kallsyms)
# After generating .tmp_vmlinux just like vmlinux, decrement the version endif
# number again, so the final vmlinux gets the same one.
# Ignore return value of 'expr'.
define rule_.tmp_vmlinux # Link a temporary vmlinux for postprocessing
$(rule_vmlinux) # (e.g. kallsyms)
if expr 0`cat .version` - 1 > .tmp_version; then true; fi
mv -f .tmp_version .version
endef
.tmp_vmlinux: $(vmlinux-objs) arch/$(ARCH)/vmlinux.lds.s FORCE .tmp_vmlinux: $(vmlinux-objs) arch/$(ARCH)/vmlinux.lds.s FORCE
$(call if_changed_rule,.tmp_vmlinux) $(call if_changed_rule,ld_tmp_vmlinux)
endif
# Finally the vmlinux rule # Finally the vmlinux rule
vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/vmlinux.lds.s FORCE quiet_cmd_ld_vmlinux = LD $(echo_target)
$(call if_changed_rule,vmlinux) cmd_ld_vmlinux = $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
$(filter-out FORCE,$^) -o $@
define rule_ld_vmlinux
set -e
$(call cmd,ld_vmlinux)
echo 'cmd_$@ := $(cmd_ld_vmlinux)' > $(@D)/.$(@F).cmd
$(NM) $@ | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
endef
# Link the actual vmlinux, which is temporary one from above,
# and possibly additional sections given in $(final-objs)
vmlinux: .tmp_vmlinux $(final-objs) arch/$(ARCH)/vmlinux.lds.s FORCE
$(call if_changed_rule,ld_vmlinux)
# The actual objects are generated when descending, # The actual objects are generated when descending,
# make sure no implicit rule kicks in # make sure no implicit rule kicks in
...@@ -861,6 +868,17 @@ ifneq ($(cmd_files),) ...@@ -861,6 +868,17 @@ ifneq ($(cmd_files),)
include $(cmd_files) include $(cmd_files)
endif endif
# function to only execute the passed command if necessary
if_changed = $(if $(strip $? \
$(filter-out $(cmd_$(1)),$(cmd_$@))\
$(filter-out $(cmd_$@),$(cmd_$(1)))),\
@set -e; \
$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))';) \
$(cmd_$(1)); \
echo 'cmd_$@ := $(cmd_$(1))' > $(@D)/.$(@F).cmd)
# execute the command and also postprocess generated .d dependencies # execute the command and also postprocess generated .d dependencies
# file # file
......
...@@ -49,6 +49,7 @@ SECTIONS ...@@ -49,6 +49,7 @@ SECTIONS
__setup_end = .; __setup_end = .;
__initcall_start = .; __initcall_start = .;
.initcall.init : { .initcall.init : {
*(.initcall.init)
*(.initcall1.init) *(.initcall1.init)
*(.initcall2.init) *(.initcall2.init)
*(.initcall3.init) *(.initcall3.init)
...@@ -72,7 +73,7 @@ SECTIONS ...@@ -72,7 +73,7 @@ SECTIONS
__nosave_end = .; __nosave_end = .;
. = ALIGN(4096); . = ALIGN(4096);
.data.page_aligned : { *(.data.idt) } .data.page_aligned : { *(.data.page_aligned) *(.data.idt) }
. = ALIGN(32); . = ALIGN(32);
.data.cacheline_aligned : { *(.data.cacheline_aligned) } .data.cacheline_aligned : { *(.data.cacheline_aligned) }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment