linux/scripts/link-vmlinux.sh
<<
>>
Prefs
   1#!/bin/sh
   2# SPDX-License-Identifier: GPL-2.0
   3#
   4# link vmlinux
   5#
   6# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and
   7# $(KBUILD_VMLINUX_MAIN) and $(KBUILD_VMLINUX_LIBS). Most are built-in.a files
   8# from top-level directories in the kernel tree, others are specified in
   9# arch/$(ARCH)/Makefile. Ordering when linking is important, and
  10# $(KBUILD_VMLINUX_INIT) must be first. $(KBUILD_VMLINUX_LIBS) are archives
  11# which are linked conditionally (not within --whole-archive), and do not
  12# require symbol indexes added.
  13#
  14# vmlinux
  15#   ^
  16#   |
  17#   +-< $(KBUILD_VMLINUX_INIT)
  18#   |   +--< init/version.o + more
  19#   |
  20#   +--< $(KBUILD_VMLINUX_MAIN)
  21#   |    +--< drivers/built-in.a mm/built-in.a + more
  22#   |
  23#   +--< $(KBUILD_VMLINUX_LIBS)
  24#   |    +--< lib/lib.a + more
  25#   |
  26#   +-< ${kallsymso} (see description in KALLSYMS section)
  27#
  28# vmlinux version (uname -v) cannot be updated during normal
  29# descending-into-subdirs phase since we do not yet know if we need to
  30# update vmlinux.
  31# Therefore this step is delayed until just before final link of vmlinux.
  32#
  33# System.map is generated to document addresses of all kernel symbols
  34
  35# Error out on error
  36set -e
  37
  38# Nice output in kbuild format
  39# Will be supressed by "make -s"
  40info()
  41{
  42        if [ "${quiet}" != "silent_" ]; then
  43                printf "  %-7s %s\n" ${1} ${2}
  44        fi
  45}
  46
  47# Thin archive build here makes a final archive with symbol table and indexes
  48# from vmlinux objects INIT and MAIN, which can be used as input to linker.
  49# KBUILD_VMLINUX_LIBS archives should already have symbol table and indexes
  50# added.
  51#
  52# Traditional incremental style of link does not require this step
  53#
  54# built-in.a output file
  55#
  56archive_builtin()
  57{
  58        info AR built-in.a
  59        rm -f built-in.a;
  60        ${AR} rcsTP${KBUILD_ARFLAGS} built-in.a                 \
  61                                ${KBUILD_VMLINUX_INIT}          \
  62                                ${KBUILD_VMLINUX_MAIN}
  63}
  64
  65# Link of vmlinux.o used for section mismatch analysis
  66# ${1} output file
  67modpost_link()
  68{
  69        local objects
  70
  71        objects="--whole-archive                                \
  72                built-in.a                                      \
  73                --no-whole-archive                              \
  74                --start-group                                   \
  75                ${KBUILD_VMLINUX_LIBS}                          \
  76                --end-group"
  77
  78        ${LD} ${LDFLAGS} -r -o ${1} ${objects}
  79}
  80
  81# Link of vmlinux
  82# ${1} - optional extra .o files
  83# ${2} - output file
  84vmlinux_link()
  85{
  86        local lds="${objtree}/${KBUILD_LDS}"
  87        local objects
  88
  89        if [ "${SRCARCH}" != "um" ]; then
  90                objects="--whole-archive                        \
  91                        built-in.a                              \
  92                        --no-whole-archive                      \
  93                        --start-group                           \
  94                        ${KBUILD_VMLINUX_LIBS}                  \
  95                        --end-group                             \
  96                        ${1}"
  97
  98                ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}     \
  99                        -T ${lds} ${objects}
 100        else
 101                objects="-Wl,--whole-archive                    \
 102                        built-in.a                              \
 103                        -Wl,--no-whole-archive                  \
 104                        -Wl,--start-group                       \
 105                        ${KBUILD_VMLINUX_LIBS}                  \
 106                        -Wl,--end-group                         \
 107                        ${1}"
 108
 109                ${CC} ${CFLAGS_vmlinux} -o ${2}                 \
 110                        -Wl,-T,${lds}                           \
 111                        ${objects}                              \
 112                        -lutil -lrt -lpthread
 113                rm -f linux
 114        fi
 115}
 116
 117
 118# Create ${2} .o file with all symbols from the ${1} object file
 119kallsyms()
 120{
 121        info KSYM ${2}
 122        local kallsymopt;
 123
 124        if [ -n "${CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX}" ]; then
 125                kallsymopt="${kallsymopt} --symbol-prefix=_"
 126        fi
 127
 128        if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
 129                kallsymopt="${kallsymopt} --all-symbols"
 130        fi
 131
 132        if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then
 133                kallsymopt="${kallsymopt} --absolute-percpu"
 134        fi
 135
 136        if [ -n "${CONFIG_KALLSYMS_BASE_RELATIVE}" ]; then
 137                kallsymopt="${kallsymopt} --base-relative"
 138        fi
 139
 140        local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL}               \
 141                      ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
 142
 143        local afile="`basename ${2} .o`.S"
 144
 145        ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${afile}
 146        ${CC} ${aflags} -c -o ${2} ${afile}
 147}
 148
 149# Create map file with all symbols from ${1}
 150# See mksymap for additional details
 151mksysmap()
 152{
 153        ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
 154}
 155
 156sortextable()
 157{
 158        ${objtree}/scripts/sortextable ${1}
 159}
 160
 161# Delete output files in case of error
 162cleanup()
 163{
 164        rm -f .tmp_System.map
 165        rm -f .tmp_kallsyms*
 166        rm -f .tmp_vmlinux*
 167        rm -f built-in.a
 168        rm -f System.map
 169        rm -f vmlinux
 170        rm -f vmlinux.o
 171}
 172
 173on_exit()
 174{
 175        if [ $? -ne 0 ]; then
 176                cleanup
 177        fi
 178}
 179trap on_exit EXIT
 180
 181on_signals()
 182{
 183        exit 1
 184}
 185trap on_signals HUP INT QUIT TERM
 186
 187#
 188#
 189# Use "make V=1" to debug this script
 190case "${KBUILD_VERBOSE}" in
 191*1*)
 192        set -x
 193        ;;
 194esac
 195
 196if [ "$1" = "clean" ]; then
 197        cleanup
 198        exit 0
 199fi
 200
 201# We need access to CONFIG_ symbols
 202case "${KCONFIG_CONFIG}" in
 203*/*)
 204        . "${KCONFIG_CONFIG}"
 205        ;;
 206*)
 207        # Force using a file from the current directory
 208        . "./${KCONFIG_CONFIG}"
 209esac
 210
 211# Update version
 212info GEN .version
 213if [ -r .version ]; then
 214        VERSION=$(expr 0$(cat .version) + 1)
 215        echo $VERSION > .version
 216else
 217        rm -f .version
 218        echo 1 > .version
 219fi;
 220
 221# final build of init/
 222${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init
 223
 224archive_builtin
 225
 226#link vmlinux.o
 227info LD vmlinux.o
 228modpost_link vmlinux.o
 229
 230# modpost vmlinux.o to check for section mismatches
 231${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
 232
 233kallsymso=""
 234kallsyms_vmlinux=""
 235if [ -n "${CONFIG_KALLSYMS}" ]; then
 236
 237        # kallsyms support
 238        # Generate section listing all symbols and add it into vmlinux
 239        # It's a three step process:
 240        # 1)  Link .tmp_vmlinux1 so it has all symbols and sections,
 241        #     but __kallsyms is empty.
 242        #     Running kallsyms on that gives us .tmp_kallsyms1.o with
 243        #     the right size
 244        # 2)  Link .tmp_vmlinux2 so it now has a __kallsyms section of
 245        #     the right size, but due to the added section, some
 246        #     addresses have shifted.
 247        #     From here, we generate a correct .tmp_kallsyms2.o
 248        # 3)  That link may have expanded the kernel image enough that
 249        #     more linker branch stubs / trampolines had to be added, which
 250        #     introduces new names, which further expands kallsyms. Do another
 251        #     pass if that is the case. In theory it's possible this results
 252        #     in even more stubs, but unlikely.
 253        #     KALLSYMS_EXTRA_PASS=1 may also used to debug or work around
 254        #     other bugs.
 255        # 4)  The correct ${kallsymso} is linked into the final vmlinux.
 256        #
 257        # a)  Verify that the System.map from vmlinux matches the map from
 258        #     ${kallsymso}.
 259
 260        kallsymso=.tmp_kallsyms2.o
 261        kallsyms_vmlinux=.tmp_vmlinux2
 262
 263        # step 1
 264        vmlinux_link "" .tmp_vmlinux1
 265        kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o
 266
 267        # step 2
 268        vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2
 269        kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o
 270
 271        # step 3
 272        size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" .tmp_kallsyms1.o)
 273        size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" .tmp_kallsyms2.o)
 274
 275        if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
 276                kallsymso=.tmp_kallsyms3.o
 277                kallsyms_vmlinux=.tmp_vmlinux3
 278
 279                vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3
 280
 281                kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o
 282        fi
 283fi
 284
 285info LD vmlinux
 286vmlinux_link "${kallsymso}" vmlinux
 287
 288if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then
 289        info SORTEX vmlinux
 290        sortextable vmlinux
 291fi
 292
 293info SYSMAP System.map
 294mksysmap vmlinux System.map
 295
 296# step a (see comment above)
 297if [ -n "${CONFIG_KALLSYMS}" ]; then
 298        mksysmap ${kallsyms_vmlinux} .tmp_System.map
 299
 300        if ! cmp -s System.map .tmp_System.map; then
 301                echo >&2 Inconsistent kallsyms data
 302                echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
 303                exit 1
 304        fi
 305fi
 306