Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 28 May 2012 17:32:28 +0000 (10:32 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 28 May 2012 17:32:28 +0000 (10:32 -0700)
Pull kbuild updates from Michal Marek.

Fixed up nontrivial merge conflict in Makefile as per Stephen Rothwell
and linux-next (and trivial arch/sparc/Makefile changes due to removed
sparc32 logic).

* 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  mips: Fix KBUILD_CPPFLAGS definition
  kbuild: fix ia64 link
  kbuild: document KBUILD_LDS, KBUILD_VMLINUX_{INIT,MAIN} and LDFLAGS_vmlinux
  kbuild: link of vmlinux moved to a script
  kbuild: refactor final link of sparc32
  kbuild: drop unused KBUILD_VMLINUX_OBJS from top-level Makefile
  kbuild: Makefile: remove unnecessary check for m68knommu ARCH

1  2 
Makefile
arch/mips/Makefile
scripts/link-vmlinux.sh

diff --combined Makefile
index b62c1e09444a981ed738581de1318aad802a2840,a7cf6a11c4d57a8adc99c004c409f5e37a135c95..dda21c3efc7b1495f335eaecb8a0d52613614aa0
+++ b/Makefile
@@@ -1,7 -1,7 +1,7 @@@
  VERSION = 3
  PATCHLEVEL = 4
  SUBLEVEL = 0
 -EXTRAVERSION = -rc1
 +EXTRAVERSION =
  NAME = Saber-toothed Squirrel
  
  # *DOCUMENTATION*
@@@ -231,10 -231,6 +231,6 @@@ endi
  # Where to locate arch specific headers
  hdr-arch  := $(SRCARCH)
  
- ifeq ($(ARCH),m68knommu)
-        hdr-arch  := m68k
- endif
  KCONFIG_CONFIG        ?= .config
  export KCONFIG_CONFIG
  
@@@ -341,7 -337,6 +337,6 @@@ AWK                = aw
  GENKSYMS      = scripts/genksyms/genksyms
  INSTALLKERNEL  := installkernel
  DEPMOD                = /sbin/depmod
- KALLSYMS      = scripts/kallsyms
  PERL          = perl
  CHECK         = sparse
  
@@@ -400,10 -395,8 +395,10 @@@ export MODVERDIR := $(if $(KBUILD_EXTMO
  
  # Files to ignore in find ... statements
  
 -RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o
 -export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git
 +RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \
 +                 -o -name .pc -o -name .hg -o -name .git \) -prune -o
 +export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
 +                       --exclude CVS --exclude .pc --exclude .hg --exclude .git
  
  # ===========================================================================
  # Rules shared between *config targets and build targets
@@@ -444,7 -437,7 +439,7 @@@ asm-generic
  
  no-dot-config-targets := clean mrproper distclean \
                         cscope gtags TAGS tags help %docs check% coccicheck \
 -                       include/linux/version.h headers_% archheaders \
 +                       include/linux/version.h headers_% archheaders archscripts \
                         kernelversion %src-pkg
  
  config-targets := 0
@@@ -566,16 -559,6 +561,16 @@@ els
  KBUILD_CFLAGS += -O2
  endif
  
 +ifdef CONFIG_READABLE_ASM
 +# Disable optimizations that make assembler listings hard to read.
 +# reorder blocks reorders the control in the function
 +# ipa clone creates specialized cloned functions
 +# partial inlining inlines only parts of functions
 +KBUILD_CFLAGS += $(call cc-option,-fno-reorder-blocks,) \
 +                 $(call cc-option,-fno-ipa-cp-clone,) \
 +                 $(call cc-option,-fno-partial-inlining)
 +endif
 +
  include $(srctree)/arch/$(SRCARCH)/Makefile
  
  ifneq ($(CONFIG_FRAME_WARN),0)
@@@ -739,197 -722,21 +734,21 @@@ libs-y1                := $(patsubst %/, %/lib.a, $(l
  libs-y2               := $(patsubst %/, %/built-in.o, $(libs-y))
  libs-y                := $(libs-y1) $(libs-y2)
  
- # Build vmlinux
- # ---------------------------------------------------------------------------
- # vmlinux is built from the objects selected by $(vmlinux-init) and
- # $(vmlinux-main). Most are built-in.o files from top-level directories
- # in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
- # Ordering when linking is important, and $(vmlinux-init) must be first.
- #
- # vmlinux
- #   ^
- #   |
- #   +-< $(vmlinux-init)
- #   |   +--< init/version.o + more
- #   |
- #   +--< $(vmlinux-main)
- #   |    +--< driver/built-in.o mm/built-in.o + more
- #   |
- #   +-< kallsyms.o (see description in CONFIG_KALLSYMS section)
- #
- # vmlinux version (uname -v) cannot be updated during normal
- # descending-into-subdirs phase since we do not yet know if we need to
- # update vmlinux.
- # Therefore this step is delayed until just before final link of vmlinux -
- # except in the kallsyms case where it is done just before adding the
- # symbols to the kernel.
- #
- # System.map is generated to document addresses of all kernel symbols
- vmlinux-init := $(head-y) $(init-y)
- vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
- vmlinux-all  := $(vmlinux-init) $(vmlinux-main)
- vmlinux-lds  := arch/$(SRCARCH)/kernel/vmlinux.lds
- export KBUILD_VMLINUX_OBJS := $(vmlinux-all)
- # Rule to link vmlinux - also used during CONFIG_KALLSYMS
- # May be overridden by arch/$(ARCH)/Makefile
- 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) vmlinux.o FORCE ,$^)
- # Generate new vmlinux version
- quiet_cmd_vmlinux_version = GEN     .version
-       cmd_vmlinux_version = set -e;                     \
-       if [ ! -r .version ]; then                      \
-         rm -f .version;                               \
-         echo 1 >.version;                             \
-       else                                            \
-         mv .version .old_version;                     \
-         expr 0$$(cat .old_version) + 1 >.version;     \
-       fi;                                             \
-       $(MAKE) $(build)=init
- # Generate System.map
- quiet_cmd_sysmap = SYSMAP
-       cmd_sysmap = $(CONFIG_SHELL) $(srctree)/scripts/mksysmap
- # Sort exception table at build time
- quiet_cmd_sortextable = SORTEX
-       cmd_sortextable = $(objtree)/scripts/sortextable
- # Link of vmlinux
- # If CONFIG_KALLSYMS is set .version is already updated
- # Generate System.map and verify that the content is consistent
- # Use + in front of the vmlinux_version rule to silent warning with make -j2
- # First command is ':' to allow us to use + in front of the rule
- define rule_vmlinux__
-       :
-       $(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))
-       $(call cmd,vmlinux__)
-       $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
-       $(if $(CONFIG_BUILDTIME_EXTABLE_SORT),                          \
-         $(Q)$(if $($(quiet)cmd_sortextable),                          \
-           echo '  $($(quiet)cmd_sortextable)  vmlinux' &&)            \
-         $(cmd_sortextable)  vmlinux)
-       $(Q)$(if $($(quiet)cmd_sysmap),                                      \
-         echo '  $($(quiet)cmd_sysmap)  System.map' &&)                     \
-       $(cmd_sysmap) $@ System.map;                                         \
-       if [ $$? -ne 0 ]; then                                               \
-               rm -f $@;                                                    \
-               /bin/false;                                                  \
-       fi;
-       $(verify_kallsyms)
- endef
- ifdef CONFIG_KALLSYMS
- # Generate section listing all symbols and add it into vmlinux $(kallsyms.o)
- # It's a three stage process:
- # o .tmp_vmlinux1 has all symbols and sections, but __kallsyms is
- #   empty
- #   Running kallsyms on that gives us .tmp_kallsyms1.o with
- #   the right size - vmlinux version (uname -v) is updated during this step
- # o .tmp_vmlinux2 now has a __kallsyms section of the right size,
- #   but due to the added section, some addresses have shifted.
- #   From here, we generate a correct .tmp_kallsyms2.o
- # o The correct .tmp_kallsyms2.o is linked into the final vmlinux.
- # o Verify that the System.map from vmlinux matches the map from
- #   .tmp_vmlinux2, just in case we did not generate kallsyms correctly.
- # o If 'make KALLSYMS_EXTRA_PASS=1" was used, do an extra pass using
- #   .tmp_vmlinux3 and .tmp_kallsyms3.o.  This is only meant as a
- #   temporary bypass to allow the kernel to be built while the
- #   maintainers work out what went wrong with kallsyms.
- last_kallsyms := 2
- ifdef KALLSYMS_EXTRA_PASS
- ifneq ($(KALLSYMS_EXTRA_PASS),0)
- last_kallsyms := 3
- endif
- endif
- kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
- define verify_kallsyms
-       $(Q)$(if $($(quiet)cmd_sysmap),                                      \
-         echo '  $($(quiet)cmd_sysmap)  .tmp_System.map' &&)                \
-         $(cmd_sysmap) .tmp_vmlinux$(last_kallsyms) .tmp_System.map
-       $(Q)cmp -s System.map .tmp_System.map ||                             \
-               (echo Inconsistent kallsyms data;                            \
-                echo This is a bug - please report about it;                \
-                echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround;      \
-                rm .tmp_kallsyms* ; /bin/false )
- endef
- # Update vmlinux version before link
- # Use + in front of this rule to silent warning about make -j1
- # First command is ':' to allow us to use + in front of this rule
- cmd_ksym_ld = $(cmd_vmlinux__)
- define rule_ksym_ld
-       : 
-       +$(call cmd,vmlinux_version)
-       $(call cmd,vmlinux__)
-       $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
- endef
- # Generate .S file with all kernel symbols
- quiet_cmd_kallsyms = KSYM    $@
-       cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
-                      $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
+ # Externally visible symbols (used by link-vmlinux.sh)
+ export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
+ export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y)
+ export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds
+ export LDFLAGS_vmlinux
  
- .tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
-       $(call if_changed_dep,as_o_S)
+ vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
  
- .tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS)
-       $(call cmd,kallsyms)
+ # Final link of vmlinux
+       cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
+ quiet_cmd_link-vmlinux = LINK    $@
  
- # .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
- .tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE
-       $(call if_changed_rule,ksym_ld)
- .tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
-       $(call if_changed,vmlinux__)
- .tmp_vmlinux3: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms2.o FORCE
-       $(call if_changed,vmlinux__)
- # Needs to visit scripts/ before $(KALLSYMS) can be used.
- $(KALLSYMS): scripts ;
- # Generate some data for debugging strange kallsyms problems
- debug_kallsyms: .tmp_map$(last_kallsyms)
- .tmp_map%: .tmp_vmlinux% FORCE
-       ($(OBJDUMP) -h $< | $(AWK) '/^ +[0-9]/{print $$4 " 0 " $$2}'; $(NM) $<) | sort > $@
- .tmp_map3: .tmp_map2
- .tmp_map2: .tmp_map1
- 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) 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) vmlinux.o $(kallsyms.o) FORCE
+ # Include targets which we want to
+ # execute if the rest of the kernel build went well.
+ vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
  ifdef CONFIG_HEADERS_CHECK
        $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
  endif
@@@ -939,22 -746,11 +758,11 @@@ endi
  ifdef CONFIG_BUILD_DOCSRC
        $(Q)$(MAKE) $(build)=Documentation
  endif
-       $(call vmlinux-modpost)
-       $(call if_changed_rule,vmlinux__)
-       $(Q)rm -f .old_version
- # build vmlinux.o first to catch section mismatch errors early
- ifdef CONFIG_KALLSYMS
- .tmp_vmlinux1: vmlinux.o
- endif
- modpost-init := $(filter-out init/built-in.o, $(vmlinux-init))
- vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
-       $(call if_changed_rule,vmlinux-modpost)
+       +$(call if_changed,link-vmlinux)
  
  # The actual objects are generated when descending, 
  # make sure no implicit rule kicks in
- $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
+ $(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
  
  # Handle descending into subdirectories listed in $(vmlinux-dirs)
  # Preset locale variables to speed up the build process. Limit locale
@@@ -988,7 -784,7 +796,7 @@@ prepare3: include/config/kernel.releas
  ifneq ($(KBUILD_SRC),)
        @$(kecho) '  Using $(srctree) as source for kernel'
        $(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
 -              echo "  $(srctree) is not clean, please run 'make mrproper'";\
 +              echo "  $(srctree) is not clean, please run 'make mrproper'"; \
                echo "  in the '$(srctree)' directory.";\
                /bin/false; \
        fi;
@@@ -1001,7 -797,7 +809,7 @@@ prepare1: prepare2 include/linux/versio
                     include/config/auto.conf
        $(cmd_crmodverdir)
  
 -archprepare: archheaders prepare1 scripts_basic
 +archprepare: archheaders archscripts prepare1 scripts_basic
  
  prepare0: archprepare FORCE
        $(Q)$(MAKE) $(build)=.
@@@ -1025,8 -821,8 +833,8 @@@ define filechk_utsrelease.
  endef
  
  define filechk_version.h
 -      (echo \#define LINUX_VERSION_CODE $(shell                             \
 -      expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL));    \
 +      (echo \#define LINUX_VERSION_CODE $(shell                         \
 +      expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \
        echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
  endef
  
@@@ -1071,11 -867,8 +879,11 @@@ hdr-dst = $(if $(KBUILD_HEADERS), dst=i
  PHONY += archheaders
  archheaders:
  
 +PHONY += archscripts
 +archscripts:
 +
  PHONY += __headers
 -__headers: include/linux/version.h scripts_basic asm-generic archheaders FORCE
 +__headers: include/linux/version.h scripts_basic asm-generic archheaders archscripts FORCE
        $(Q)$(MAKE) $(build)=scripts build_unifdef
  
  PHONY += headers_install_all
@@@ -1181,8 -974,6 +989,6 @@@ endif # CONFIG_MODULE
  
  # Directories & files removed with 'make clean'
  CLEAN_DIRS  += $(MODVERDIR)
- CLEAN_FILES +=        vmlinux System.map \
-                 .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
  
  # Directories & files removed with 'make mrproper'
  MRPROPER_DIRS  += include/config usr/include include/generated          \
@@@ -1428,6 -1219,7 +1234,7 @@@ scripts: 
  endif # KBUILD_EXTMOD
  
  clean: $(clean-dirs)
+       $(Q)$(CONFIG_SHELL) $(srctree)/scripts/link-vmlinux.sh clean
        $(call cmd,rmdirs)
        $(call cmd,rmfiles)
        @find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
@@@ -1493,13 -1285,6 +1300,13 @@@ kernelrelease
  kernelversion:
        @echo $(KERNELVERSION)
  
 +# Clear a bunch of variables before executing the submake
 +tools/: FORCE
 +      $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/
 +
 +tools/%: FORCE
 +      $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ $*
 +
  # Single targets
  # ---------------------------------------------------------------------------
  # Single targets are compatible with:
@@@ -1568,14 -1353,6 +1375,6 @@@ quiet_cmd_depmod = DEPMOD  $(KERNELRELE
  cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \
                    $(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
  
- a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \
-         $(KBUILD_AFLAGS_KERNEL)                              \
-         $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \
-         $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
- quiet_cmd_as_o_S = AS      $@
- cmd_as_o_S       = $(CC) $(a_flags) -c -o $@ $<
  # read all saved command lines
  
  targets := $(wildcard $(sort $(targets)))
diff --combined arch/mips/Makefile
index 76017c25a9e6fd1af1ea1ac215658548c99f2156,722e04a8240e5b0ca93d6adeafd5a7dea0f485ac..764e37a9dbb34c1b6ecb870457bb0067934f556e
@@@ -219,8 -219,8 +219,8 @@@ endi
  
  KBUILD_AFLAGS += $(cflags-y)
  KBUILD_CFLAGS += $(cflags-y)
- KBUILD_CPPFLAGS += -D"VMLINUX_LOAD_ADDRESS=$(load-y)"
- KBUILD_CPPFLAGS += -D"DATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)"
+ KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRESS=$(load-y)
+ KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)
  
  LDFLAGS                       += -m $(ld-emul)
  
@@@ -235,7 -235,7 +235,7 @@@ endi
  
  OBJCOPYFLAGS          += --remove-section=.reginfo
  
 -head-y := arch/mips/kernel/head.o arch/mips/kernel/init_task.o
 +head-y := arch/mips/kernel/head.o
  
  libs-y                        += arch/mips/lib/
  
diff --combined scripts/link-vmlinux.sh
index 0000000000000000000000000000000000000000,1f4c27bd5d2af1c04408ab638d87807e0d78c87b..cd9c6c6bb4c9d9dba4f9c80fc5edbb67170beef8
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,211 +1,221 @@@
+ #!/bin/sh
+ #
+ # link vmlinux
+ #
+ # vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and
+ # $(KBUILD_VMLINUX_MAIN). Most are built-in.o files from top-level directories
+ # in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
+ # Ordering when linking is important, and $(KBUILD_VMLINUX_INIT) must be first.
+ #
+ # vmlinux
+ #   ^
+ #   |
+ #   +-< $(KBUILD_VMLINUX_INIT)
+ #   |   +--< init/version.o + more
+ #   |
+ #   +--< $(KBUILD_VMLINUX_MAIN)
+ #   |    +--< drivers/built-in.o mm/built-in.o + more
+ #   |
+ #   +-< ${kallsymso} (see description in KALLSYMS section)
+ #
+ # vmlinux version (uname -v) cannot be updated during normal
+ # descending-into-subdirs phase since we do not yet know if we need to
+ # update vmlinux.
+ # Therefore this step is delayed until just before final link of vmlinux.
+ #
+ # System.map is generated to document addresses of all kernel symbols
+ # Error out on error
+ set -e
+ # Nice output in kbuild format
+ # Will be supressed by "make -s"
+ info()
+ {
+       if [ "${quiet}" != "silent_" ]; then
+               printf "  %-7s %s\n" ${1} ${2}
+       fi
+ }
+ # Link of vmlinux.o used for section mismatch analysis
+ # ${1} output file
+ modpost_link()
+ {
+       ${LD} ${LDFLAGS} -r -o ${1} ${KBUILD_VMLINUX_INIT}                   \
+               --start-group ${KBUILD_VMLINUX_MAIN} --end-group
+ }
+ # Link of vmlinux
+ # ${1} - optional extra .o files
+ # ${2} - output file
+ vmlinux_link()
+ {
+       local lds="${objtree}/${KBUILD_LDS}"
+       if [ "${SRCARCH}" != "um" ]; then
+               ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}                  \
+                       -T ${lds} ${KBUILD_VMLINUX_INIT}                     \
+                       --start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1}
+       else
+               ${CC} ${CFLAGS_vmlinux} -o ${2}                              \
+                       -Wl,-T,${lds} ${KBUILD_VMLINUX_INIT}                 \
+                       -Wl,--start-group                                    \
+                                ${KBUILD_VMLINUX_MAIN}                      \
+                       -Wl,--end-group                                      \
+                       -lutil ${1}
+               rm -f linux
+       fi
+ }
+ # Create ${2} .o file with all symbols from the ${1} object file
+ kallsyms()
+ {
+       info KSYM ${2}
+       local kallsymopt;
+       if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
+               kallsymopt=--all-symbols
+       fi
+       local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL}               \
+                     ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
+       ${NM} -n ${1} | \
+               scripts/kallsyms ${kallsymopt} | \
+               ${CC} ${aflags} -c -o ${2} -x assembler-with-cpp -
+ }
+ # Create map file with all symbols from ${1}
+ # See mksymap for additional details
+ mksysmap()
+ {
+       ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
+ }
++sortextable()
++{
++      ${objtree}/scripts/sortextable ${1}
++}
++
+ # Delete output files in case of error
+ trap cleanup SIGHUP SIGINT SIGQUIT SIGTERM ERR
+ cleanup()
+ {
+       rm -f .old_version
+       rm -f .tmp_System.map
+       rm -f .tmp_kallsyms*
+       rm -f .tmp_version
+       rm -f .tmp_vmlinux*
+       rm -f System.map
+       rm -f vmlinux
+       rm -f vmlinux.o
+ }
+ #
+ #
+ # Use "make V=1" to debug this script
+ case "${KBUILD_VERBOSE}" in
+ *1*)
+       set -x
+       ;;
+ esac
+ if [ "$1" = "clean" ]; then
+       cleanup
+       exit 0
+ fi
+ # We need access to CONFIG_ symbols
+ . ./.config
+ #link vmlinux.o
+ info LD vmlinux.o
+ modpost_link vmlinux.o
+ # modpost vmlinux.o to check for section mismatches
+ ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
+ # Update version
+ info GEN .version
+ if [ ! -r .version ]; then
+       rm -f .version;
+       echo 1 >.version;
+ else
+       mv .version .old_version;
+       expr 0$(cat .old_version) + 1 >.version;
+ fi;
+ # final build of init/
+ ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init
+ kallsymso=""
+ kallsyms_vmlinux=""
+ if [ -n "${CONFIG_KALLSYMS}" ]; then
+       # kallsyms support
+       # Generate section listing all symbols and add it into vmlinux
+       # It's a three step process:
+       # 1)  Link .tmp_vmlinux1 so it has all symbols and sections,
+       #     but __kallsyms is empty.
+       #     Running kallsyms on that gives us .tmp_kallsyms1.o with
+       #     the right size
+       # 2)  Link .tmp_vmlinux2 so it now has a __kallsyms section of
+       #     the right size, but due to the added section, some
+       #     addresses have shifted.
+       #     From here, we generate a correct .tmp_kallsyms2.o
+       # 2a) We may use an extra pass as this has been necessary to
+       #     woraround some alignment related bugs.
+       #     KALLSYMS_EXTRA_PASS=1 is used to trigger this.
+       # 3)  The correct ${kallsymso} is linked into the final vmlinux.
+       #
+       # a)  Verify that the System.map from vmlinux matches the map from
+       #     ${kallsymso}.
+       kallsymso=.tmp_kallsyms2.o
+       kallsyms_vmlinux=.tmp_vmlinux2
+       # step 1
+       vmlinux_link "" .tmp_vmlinux1
+       kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o
+       # step 2
+       vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2
+       kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o
+       # step 2a
+       if [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
+               kallsymso=.tmp_kallsyms3.o
+               kallsyms_vmlinux=.tmp_vmlinux3
+               vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3
+               kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o
+       fi
+ fi
+ info LD vmlinux
+ vmlinux_link "${kallsymso}" vmlinux
++if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then
++      info SORTEX vmlinux
++      sortextable vmlinux
++fi
++
+ info SYSMAP System.map
+ mksysmap vmlinux System.map
+ # step a (see comment above)
+ if [ -n "${CONFIG_KALLSYMS}" ]; then
+       mksysmap ${kallsyms_vmlinux} .tmp_System.map
+       if ! cmp -s System.map .tmp_System.map; then
+               echo Inconsistent kallsyms data
+               echo echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
+               cleanup
+               exit 1
+       fi
+ fi
+ # We made a new kernel - delete old version file
+ rm -f .old_version