aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile215
-rw-r--r--arch/um/Makefile11
-rw-r--r--scripts/link-vmlinux.sh211
3 files changed, 225 insertions, 212 deletions
diff --git a/Makefile b/Makefile
index 7ea0c07779bd..a7cf6a11c4d5 100644
--- a/Makefile
+++ b/Makefile
@@ -337,7 +337,6 @@ AWK = awk
337GENKSYMS = scripts/genksyms/genksyms 337GENKSYMS = scripts/genksyms/genksyms
338INSTALLKERNEL := installkernel 338INSTALLKERNEL := installkernel
339DEPMOD = /sbin/depmod 339DEPMOD = /sbin/depmod
340KALLSYMS = scripts/kallsyms
341PERL = perl 340PERL = perl
342CHECK = sparse 341CHECK = sparse
343 342
@@ -723,191 +722,21 @@ libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
723libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)) 722libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
724libs-y := $(libs-y1) $(libs-y2) 723libs-y := $(libs-y1) $(libs-y2)
725 724
726# externally visible symbols 725# Externally visible symbols (used by link-vmlinux.sh)
727export KBUILD_VMLINUX_INIT := $(head-y) $(init-y) 726export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
728export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y) 727export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y)
729export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds 728export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
729export LDFLAGS_vmlinux
730 730
731# Build vmlinux 731vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
732# ---------------------------------------------------------------------------
733# vmlinux is built from the objects selected by $(vmlinux-init) and
734# $(vmlinux-main). Most are built-in.o files from top-level directories
735# in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
736# Ordering when linking is important, and $(vmlinux-init) must be first.
737#
738# vmlinux
739# ^
740# |
741# +-< $(vmlinux-init)
742# | +--< init/version.o + more
743# |
744# +--< $(vmlinux-main)
745# | +--< driver/built-in.o mm/built-in.o + more
746# |
747# +-< kallsyms.o (see description in CONFIG_KALLSYMS section)
748#
749# vmlinux version (uname -v) cannot be updated during normal
750# descending-into-subdirs phase since we do not yet know if we need to
751# update vmlinux.
752# Therefore this step is delayed until just before final link of vmlinux -
753# except in the kallsyms case where it is done just before adding the
754# symbols to the kernel.
755#
756# System.map is generated to document addresses of all kernel symbols
757
758vmlinux-init := $(head-y) $(init-y)
759vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
760vmlinux-all := $(vmlinux-init) $(vmlinux-main)
761vmlinux-lds := arch/$(SRCARCH)/kernel/vmlinux.lds
762
763# Rule to link vmlinux - also used during CONFIG_KALLSYMS
764# May be overridden by arch/$(ARCH)/Makefile
765quiet_cmd_vmlinux__ ?= LD $@
766 cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
767 -T $(vmlinux-lds) $(vmlinux-init) \
768 --start-group $(vmlinux-main) --end-group \
769 $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^)
770
771# Generate new vmlinux version
772quiet_cmd_vmlinux_version = GEN .version
773 cmd_vmlinux_version = set -e; \
774 if [ ! -r .version ]; then \
775 rm -f .version; \
776 echo 1 >.version; \
777 else \
778 mv .version .old_version; \
779 expr 0$$(cat .old_version) + 1 >.version; \
780 fi; \
781 $(MAKE) $(build)=init
782
783# Generate System.map
784quiet_cmd_sysmap = SYSMAP
785 cmd_sysmap = $(CONFIG_SHELL) $(srctree)/scripts/mksysmap
786
787# Link of vmlinux
788# If CONFIG_KALLSYMS is set .version is already updated
789# Generate System.map and verify that the content is consistent
790# Use + in front of the vmlinux_version rule to silent warning with make -j2
791# First command is ':' to allow us to use + in front of the rule
792define rule_vmlinux__
793 :
794 $(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))
795
796 $(call cmd,vmlinux__)
797 $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
798
799 $(Q)$(if $($(quiet)cmd_sysmap), \
800 echo ' $($(quiet)cmd_sysmap) System.map' &&) \
801 $(cmd_sysmap) $@ System.map; \
802 if [ $$? -ne 0 ]; then \
803 rm -f $@; \
804 /bin/false; \
805 fi;
806 $(verify_kallsyms)
807endef
808
809
810ifdef CONFIG_KALLSYMS
811# Generate section listing all symbols and add it into vmlinux $(kallsyms.o)
812# It's a three stage process:
813# o .tmp_vmlinux1 has all symbols and sections, but __kallsyms is
814# empty
815# Running kallsyms on that gives us .tmp_kallsyms1.o with
816# the right size - vmlinux version (uname -v) is updated during this step
817# o .tmp_vmlinux2 now has a __kallsyms section of the right size,
818# but due to the added section, some addresses have shifted.
819# From here, we generate a correct .tmp_kallsyms2.o
820# o The correct .tmp_kallsyms2.o is linked into the final vmlinux.
821# o Verify that the System.map from vmlinux matches the map from
822# .tmp_vmlinux2, just in case we did not generate kallsyms correctly.
823# o If 'make KALLSYMS_EXTRA_PASS=1" was used, do an extra pass using
824# .tmp_vmlinux3 and .tmp_kallsyms3.o. This is only meant as a
825# temporary bypass to allow the kernel to be built while the
826# maintainers work out what went wrong with kallsyms.
827
828last_kallsyms := 2
829
830ifdef KALLSYMS_EXTRA_PASS
831ifneq ($(KALLSYMS_EXTRA_PASS),0)
832last_kallsyms := 3
833endif
834endif
835
836kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
837
838define verify_kallsyms
839 $(Q)$(if $($(quiet)cmd_sysmap), \
840 echo ' $($(quiet)cmd_sysmap) .tmp_System.map' &&) \
841 $(cmd_sysmap) .tmp_vmlinux$(last_kallsyms) .tmp_System.map
842 $(Q)cmp -s System.map .tmp_System.map || \
843 (echo Inconsistent kallsyms data; \
844 echo This is a bug - please report about it; \
845 echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround; \
846 rm .tmp_kallsyms* ; /bin/false )
847endef
848
849# Update vmlinux version before link
850# Use + in front of this rule to silent warning about make -j1
851# First command is ':' to allow us to use + in front of this rule
852cmd_ksym_ld = $(cmd_vmlinux__)
853define rule_ksym_ld
854 :
855 +$(call cmd,vmlinux_version)
856 $(call cmd,vmlinux__)
857 $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
858endef
859
860# Generate .S file with all kernel symbols
861quiet_cmd_kallsyms = KSYM $@
862 cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
863 $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
864
865.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
866 $(call if_changed_dep,as_o_S)
867 732
868.tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS) 733# Final link of vmlinux
869 $(call cmd,kallsyms) 734 cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
735quiet_cmd_link-vmlinux = LINK $@
870 736
871# .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version 737# Include targets which we want to
872.tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE 738# execute if the rest of the kernel build went well.
873 $(call if_changed_rule,ksym_ld) 739vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
874
875.tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
876 $(call if_changed,vmlinux__)
877
878.tmp_vmlinux3: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms2.o FORCE
879 $(call if_changed,vmlinux__)
880
881# Needs to visit scripts/ before $(KALLSYMS) can be used.
882$(KALLSYMS): scripts ;
883
884# Generate some data for debugging strange kallsyms problems
885debug_kallsyms: .tmp_map$(last_kallsyms)
886
887.tmp_map%: .tmp_vmlinux% FORCE
888 ($(OBJDUMP) -h $< | $(AWK) '/^ +[0-9]/{print $$4 " 0 " $$2}'; $(NM) $<) | sort > $@
889
890.tmp_map3: .tmp_map2
891
892.tmp_map2: .tmp_map1
893
894endif # ifdef CONFIG_KALLSYMS
895
896# Do modpost on a prelinked vmlinux. The finally linked vmlinux has
897# relevant sections renamed as per the linker script.
898quiet_cmd_vmlinux-modpost = LD $@
899 cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
900 $(vmlinux-init) --start-group $(vmlinux-main) --end-group \
901 $(filter-out $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
902define rule_vmlinux-modpost
903 :
904 +$(call cmd,vmlinux-modpost)
905 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
906 $(Q)echo 'cmd_$@ := $(cmd_vmlinux-modpost)' > $(dot-target).cmd
907endef
908
909# vmlinux image - including updated kernel symbols
910vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE
911ifdef CONFIG_HEADERS_CHECK 740ifdef CONFIG_HEADERS_CHECK
912 $(Q)$(MAKE) -f $(srctree)/Makefile headers_check 741 $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
913endif 742endif
@@ -917,22 +746,11 @@ endif
917ifdef CONFIG_BUILD_DOCSRC 746ifdef CONFIG_BUILD_DOCSRC
918 $(Q)$(MAKE) $(build)=Documentation 747 $(Q)$(MAKE) $(build)=Documentation
919endif 748endif
920 $(call vmlinux-modpost) 749 +$(call if_changed,link-vmlinux)
921 $(call if_changed_rule,vmlinux__)
922 $(Q)rm -f .old_version
923
924# build vmlinux.o first to catch section mismatch errors early
925ifdef CONFIG_KALLSYMS
926.tmp_vmlinux1: vmlinux.o
927endif
928
929modpost-init := $(filter-out init/built-in.o, $(vmlinux-init))
930vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
931 $(call if_changed_rule,vmlinux-modpost)
932 750
933# The actual objects are generated when descending, 751# The actual objects are generated when descending,
934# make sure no implicit rule kicks in 752# make sure no implicit rule kicks in
935$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; 753$(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
936 754
937# Handle descending into subdirectories listed in $(vmlinux-dirs) 755# Handle descending into subdirectories listed in $(vmlinux-dirs)
938# Preset locale variables to speed up the build process. Limit locale 756# Preset locale variables to speed up the build process. Limit locale
@@ -1156,8 +974,6 @@ endif # CONFIG_MODULES
1156 974
1157# Directories & files removed with 'make clean' 975# Directories & files removed with 'make clean'
1158CLEAN_DIRS += $(MODVERDIR) 976CLEAN_DIRS += $(MODVERDIR)
1159CLEAN_FILES += vmlinux System.map \
1160 .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
1161 977
1162# Directories & files removed with 'make mrproper' 978# Directories & files removed with 'make mrproper'
1163MRPROPER_DIRS += include/config usr/include include/generated \ 979MRPROPER_DIRS += include/config usr/include include/generated \
@@ -1403,6 +1219,7 @@ scripts: ;
1403endif # KBUILD_EXTMOD 1219endif # KBUILD_EXTMOD
1404 1220
1405clean: $(clean-dirs) 1221clean: $(clean-dirs)
1222 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/link-vmlinux.sh clean
1406 $(call cmd,rmdirs) 1223 $(call cmd,rmdirs)
1407 $(call cmd,rmfiles) 1224 $(call cmd,rmfiles)
1408 @find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \ 1225 @find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
@@ -1536,14 +1353,6 @@ quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
1536cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \ 1353cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \
1537 $(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*) 1354 $(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
1538 1355
1539a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \
1540 $(KBUILD_AFLAGS_KERNEL) \
1541 $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \
1542 $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
1543
1544quiet_cmd_as_o_S = AS $@
1545cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
1546
1547# read all saved command lines 1356# read all saved command lines
1548 1357
1549targets := $(wildcard $(sort $(targets))) 1358targets := $(wildcard $(sort $(targets)))
diff --git a/arch/um/Makefile b/arch/um/Makefile
index 55c0661e2b5d..097091059aaa 100644
--- a/arch/um/Makefile
+++ b/arch/um/Makefile
@@ -121,15 +121,8 @@ LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc
121 121
122LD_FLAGS_CMDLINE = $(foreach opt,$(LDFLAGS),-Wl,$(opt)) 122LD_FLAGS_CMDLINE = $(foreach opt,$(LDFLAGS),-Wl,$(opt))
123 123
124CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) $(LD_FLAGS_CMDLINE) 124# Used by link-vmlinux.sh which has special support for um link
125define cmd_vmlinux__ 125export CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) $(LD_FLAGS_CMDLINE)
126 $(CC) $(CFLAGS_vmlinux) -o $@ \
127 -Wl,-T,$(vmlinux-lds) $(vmlinux-init) \
128 -Wl,--start-group $(vmlinux-main) -Wl,--end-group \
129 -lutil \
130 $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o \
131 FORCE ,$^) ; rm -f linux
132endef
133 126
134# When cleaning we don't include .config, so we don't include 127# When cleaning we don't include .config, so we don't include
135# TT or skas makefiles and don't clean skas_ptregs.h. 128# TT or skas makefiles and don't clean skas_ptregs.h.
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
new file mode 100644
index 000000000000..26c5b658c2d5
--- /dev/null
+++ b/scripts/link-vmlinux.sh
@@ -0,0 +1,211 @@
1#!/bin/sh
2#
3# link vmlinux
4#
5# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and
6# $(KBUILD_VMLINUX_MAIN). Most are built-in.o files from top-level directories
7# in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
8# Ordering when linking is important, and $(KBUILD_VMLINUX_INIT) must be first.
9#
10# vmlinux
11# ^
12# |
13# +-< $(KBUILD_VMLINUX_INIT)
14# | +--< init/version.o + more
15# |
16# +--< $(KBUILD_VMLINUX_MAIN)
17# | +--< drivers/built-in.o mm/built-in.o + more
18# |
19# +-< ${kallsymso} (see description in KALLSYMS section)
20#
21# vmlinux version (uname -v) cannot be updated during normal
22# descending-into-subdirs phase since we do not yet know if we need to
23# update vmlinux.
24# Therefore this step is delayed until just before final link of vmlinux.
25#
26# System.map is generated to document addresses of all kernel symbols
27
28# Error out on error
29set -e
30
31# Nice output in kbuild format
32# Will be supressed by "make -s"
33info()
34{
35 if [ "${quiet}" != "silent_" ]; then
36 printf " %-7s %s\n" ${1} ${2}
37 fi
38}
39
40# Link of vmlinux.o used for section mismatch analysis
41# ${1} output file
42modpost_link()
43{
44 ${LD} ${LDFLAGS} -r -o ${1} ${KBUILD_VMLINUX_INIT} \
45 --start-group ${KBUILD_VMLINUX_MAIN} --end-group
46}
47
48# Link of vmlinux
49# ${1} - optional extra .o files
50# ${2} - output file
51vmlinux_link()
52{
53 local lds="${objtree}/${KBUILD_LDS}"
54
55 if [ "${SRCARCH}" != "um" ]; then
56 ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \
57 -T ${lds} ${KBUILD_VMLINUX_INIT} \
58 --start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1}
59 else
60 ${CC} ${CFLAGS_vmlinux} -o ${2} \
61 -Wl,-T,${lds} ${KBUILD_VMLINUX_INIT} \
62 -Wl,--start-group \
63 ${KBUILD_VMLINUX_MAIN} \
64 -Wl,--end-group \
65 -lutil ${1}
66 rm -f linux
67 fi
68}
69
70
71# Create ${2} .o file with all symbols from the ${1} object file
72kallsyms()
73{
74 info KSYM ${2}
75 local kallsymopt;
76
77 if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
78 kallsymopt=--all-symbols
79 fi
80
81 local aflags="${KBUILD_AFLAGS} ${NOSTDINC_FLAGS} \
82 ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
83
84 ${NM} -n ${1} | \
85 scripts/kallsyms ${kallsymopt} | \
86 ${CC} ${aflags} -c -o ${2} -x assembler-with-cpp -
87}
88
89# Create map file with all symbols from ${1}
90# See mksymap for additional details
91mksysmap()
92{
93 ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
94}
95
96# Delete output files in case of error
97trap cleanup SIGHUP SIGINT SIGQUIT SIGTERM ERR
98cleanup()
99{
100 rm -f .old_version
101 rm -f .tmp_System.map
102 rm -f .tmp_kallsyms*
103 rm -f .tmp_version
104 rm -f .tmp_vmlinux*
105 rm -f System.map
106 rm -f vmlinux
107 rm -f vmlinux.o
108}
109
110#
111#
112# Use "make V=1" to debug this script
113case "${KBUILD_VERBOSE}" in
114*1*)
115 set -x
116 ;;
117esac
118
119if [ "$1" = "clean" ]; then
120 cleanup
121 exit 0
122fi
123
124# We need access to CONFIG_ symbols
125. ./.config
126
127#link vmlinux.o
128info LD vmlinux.o
129modpost_link vmlinux.o
130
131# modpost vmlinux.o to check for section mismatches
132${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
133
134# Update version
135info GEN .version
136if [ ! -r .version ]; then
137 rm -f .version;
138 echo 1 >.version;
139else
140 mv .version .old_version;
141 expr 0$(cat .old_version) + 1 >.version;
142fi;
143
144# final build of init/
145${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init
146
147kallsymso=""
148kallsyms_vmlinux=""
149if [ -n "${CONFIG_KALLSYMS}" ]; then
150
151 # kallsyms support
152 # Generate section listing all symbols and add it into vmlinux
153 # It's a three step process:
154 # 1) Link .tmp_vmlinux1 so it has all symbols and sections,
155 # but __kallsyms is empty.
156 # Running kallsyms on that gives us .tmp_kallsyms1.o with
157 # the right size
158 # 2) Link .tmp_vmlinux2 so it now has a __kallsyms section of
159 # the right size, but due to the added section, some
160 # addresses have shifted.
161 # From here, we generate a correct .tmp_kallsyms2.o
162 # 2a) We may use an extra pass as this has been necessary to
163 # woraround some alignment related bugs.
164 # KALLSYMS_EXTRA_PASS=1 is used to trigger this.
165 # 3) The correct ${kallsymso} is linked into the final vmlinux.
166 #
167 # a) Verify that the System.map from vmlinux matches the map from
168 # ${kallsymso}.
169
170 kallsymso=.tmp_kallsyms2.o
171 kallsyms_vmlinux=.tmp_vmlinux2
172
173 # step 1
174 vmlinux_link "" .tmp_vmlinux1
175 kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o
176
177 # step 2
178 vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2
179 kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o
180
181 # step 2a
182 if [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
183 kallsymso=.tmp_kallsyms3.o
184 kallsyms_vmlinux=.tmp_vmlinux3
185
186 vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3
187
188 kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o
189 fi
190fi
191
192info LD vmlinux
193vmlinux_link "${kallsymso}" vmlinux
194
195info SYSMAP System.map
196mksysmap vmlinux System.map
197
198# step a (see comment above)
199if [ -n "${CONFIG_KALLSYMS}" ]; then
200 mksysmap ${kallsyms_vmlinux} .tmp_System.map
201
202 if ! cmp -s System.map .tmp_System.map; then
203 echo Inconsistent kallsyms data
204 echo echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
205 cleanup
206 exit 1
207 fi
208fi
209
210# We made a new kernel - delete old version file
211rm -f .old_version