~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/scripts/link-vmlinux.sh

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /scripts/link-vmlinux.sh (Version linux-6.11.5) and /scripts/link-vmlinux.sh (Version linux-5.14.21)


  1 #!/bin/sh                                           1 #!/bin/sh
  2 # SPDX-License-Identifier: GPL-2.0                  2 # SPDX-License-Identifier: GPL-2.0
  3 #                                                   3 #
  4 # link vmlinux                                      4 # link vmlinux
  5 #                                                   5 #
  6 # vmlinux is linked from the objects in vmlinu !!   6 # vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_OBJS) and
  7 # vmlinux.a contains objects that are linked u !!   7 # $(KBUILD_VMLINUX_LIBS). Most are built-in.a files from top-level directories
                                                   >>   8 # in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
  8 # $(KBUILD_VMLINUX_LIBS) are archives which ar      9 # $(KBUILD_VMLINUX_LIBS) are archives which are linked conditionally
  9 # (not within --whole-archive), and do not req     10 # (not within --whole-archive), and do not require symbol indexes added.
 10 #                                                  11 #
 11 # vmlinux                                          12 # vmlinux
 12 #   ^                                              13 #   ^
 13 #   |                                              14 #   |
 14 #   +--< vmlinux.a                             !!  15 #   +--< $(KBUILD_VMLINUX_OBJS)
                                                   >>  16 #   |    +--< init/built-in.a drivers/built-in.a mm/built-in.a + more
 15 #   |                                              17 #   |
 16 #   +--< $(KBUILD_VMLINUX_LIBS)                    18 #   +--< $(KBUILD_VMLINUX_LIBS)
 17 #   |    +--< lib/lib.a + more                     19 #   |    +--< lib/lib.a + more
 18 #   |                                              20 #   |
 19 #   +-< ${kallsymso} (see description in KALLS     21 #   +-< ${kallsymso} (see description in KALLSYMS section)
 20 #                                                  22 #
 21 # vmlinux version (uname -v) cannot be updated     23 # vmlinux version (uname -v) cannot be updated during normal
 22 # descending-into-subdirs phase since we do no     24 # descending-into-subdirs phase since we do not yet know if we need to
 23 # update vmlinux.                                  25 # update vmlinux.
 24 # Therefore this step is delayed until just be     26 # Therefore this step is delayed until just before final link of vmlinux.
 25 #                                                  27 #
 26 # System.map is generated to document addresse     28 # System.map is generated to document addresses of all kernel symbols
 27                                                    29 
 28 # Error out on error                               30 # Error out on error
 29 set -e                                             31 set -e
 30                                                    32 
 31 LD="$1"                                            33 LD="$1"
 32 KBUILD_LDFLAGS="$2"                                34 KBUILD_LDFLAGS="$2"
 33 LDFLAGS_vmlinux="$3"                               35 LDFLAGS_vmlinux="$3"
 34                                                    36 
 35 is_enabled() {                                 << 
 36         grep -q "^$1=y" include/config/auto.co << 
 37 }                                              << 
 38                                                << 
 39 # Nice output in kbuild format                     37 # Nice output in kbuild format
 40 # Will be supressed by "make -s"                   38 # Will be supressed by "make -s"
 41 info()                                             39 info()
 42 {                                                  40 {
 43         printf "  %-7s %s\n" "${1}" "${2}"         41         printf "  %-7s %s\n" "${1}" "${2}"
 44 }                                                  42 }
 45                                                    43 
 46 # Link of vmlinux                              !!  44 # Generate a linker script to ensure correct ordering of initcalls.
 47 # ${1} - output file                           !!  45 gen_initcalls()
 48 vmlinux_link()                                 << 
 49 {                                                  46 {
 50         local output=${1}                      !!  47         info GEN .tmp_initcalls.lds
 51         local objs                             << 
 52         local libs                             << 
 53         local ld                               << 
 54         local ldflags                          << 
 55         local ldlibs                           << 
 56                                                    48 
 57         info LD ${output}                      !!  49         ${PYTHON} ${srctree}/scripts/jobserver-exec             \
                                                   >>  50         ${PERL} ${srctree}/scripts/generate_initcall_order.pl   \
                                                   >>  51                 ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}   \
                                                   >>  52                 > .tmp_initcalls.lds
                                                   >>  53 }
 58                                                    54 
 59         # skip output file argument            !!  55 # If CONFIG_LTO_CLANG is selected, collect generated symbol versions into
 60         shift                                  !!  56 # .tmp_symversions.lds
                                                   >>  57 gen_symversions()
                                                   >>  58 {
                                                   >>  59         info GEN .tmp_symversions.lds
                                                   >>  60         rm -f .tmp_symversions.lds
                                                   >>  61 
                                                   >>  62         for o in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do
                                                   >>  63                 if [ -f ${o}.symversions ]; then
                                                   >>  64                         cat ${o}.symversions >> .tmp_symversions.lds
                                                   >>  65                 fi
                                                   >>  66         done
                                                   >>  67 }
                                                   >>  68 
                                                   >>  69 # Link of vmlinux.o used for section mismatch analysis
                                                   >>  70 # ${1} output file
                                                   >>  71 modpost_link()
                                                   >>  72 {
                                                   >>  73         local objects
                                                   >>  74         local lds=""
 61                                                    75 
 62         if is_enabled CONFIG_LTO_CLANG || is_e !!  76         objects="--whole-archive                                \
 63                 # Use vmlinux.o instead of per !!  77                 ${KBUILD_VMLINUX_OBJS}                          \
 64                 objs=vmlinux.o                 !!  78                 --no-whole-archive                              \
 65                 libs=                          !!  79                 --start-group                                   \
                                                   >>  80                 ${KBUILD_VMLINUX_LIBS}                          \
                                                   >>  81                 --end-group"
                                                   >>  82 
                                                   >>  83         if [ -n "${CONFIG_LTO_CLANG}" ]; then
                                                   >>  84                 gen_initcalls
                                                   >>  85                 lds="-T .tmp_initcalls.lds"
                                                   >>  86 
                                                   >>  87                 if [ -n "${CONFIG_MODVERSIONS}" ]; then
                                                   >>  88                         gen_symversions
                                                   >>  89                         lds="${lds} -T .tmp_symversions.lds"
                                                   >>  90                 fi
                                                   >>  91 
                                                   >>  92                 # This might take a while, so indicate that we're doing
                                                   >>  93                 # an LTO link
                                                   >>  94                 info LTO ${1}
 66         else                                       95         else
 67                 objs=vmlinux.a                 !!  96                 info LD ${1}
 68                 libs="${KBUILD_VMLINUX_LIBS}"  << 
 69         fi                                         97         fi
 70                                                    98 
 71         if is_enabled CONFIG_MODULES; then     !!  99         ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${lds} ${objects}
 72                 objs="${objs} .vmlinux.export. !! 100 }
 73         fi                                     << 
 74                                                   101 
 75         objs="${objs} init/version-timestamp.o !! 102 objtool_link()
                                                   >> 103 {
                                                   >> 104         local objtoolcmd;
                                                   >> 105         local objtoolopt;
 76                                                   106 
 77         if [ "${SRCARCH}" = "um" ]; then       !! 107         if [ "${CONFIG_LTO_CLANG} ${CONFIG_STACK_VALIDATION}" = "y y" ]; then
 78                 wl=-Wl,                        !! 108                 # Don't perform vmlinux validation unless explicitly requested,
 79                 ld="${CC}"                     !! 109                 # but run objtool on vmlinux.o now that we have an object file.
 80                 ldflags="${CFLAGS_vmlinux}"    !! 110                 if [ -n "${CONFIG_UNWINDER_ORC}" ]; then
 81                 ldlibs="-lutil -lrt -lpthread" !! 111                         objtoolcmd="orc generate"
 82         else                                   !! 112                 fi
 83                 wl=                            !! 113 
 84                 ld="${LD}"                     !! 114                 objtoolopt="${objtoolopt} --duplicate"
 85                 ldflags="${KBUILD_LDFLAGS} ${L !! 115 
 86                 ldlibs=                        !! 116                 if [ -n "${CONFIG_FTRACE_MCOUNT_USE_OBJTOOL}" ]; then
                                                   >> 117                         objtoolopt="${objtoolopt} --mcount"
                                                   >> 118                 fi
                                                   >> 119         fi
                                                   >> 120 
                                                   >> 121         if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then
                                                   >> 122                 objtoolopt="${objtoolopt} --noinstr"
                                                   >> 123         fi
                                                   >> 124 
                                                   >> 125         if [ -n "${objtoolopt}" ]; then
                                                   >> 126                 if [ -z "${objtoolcmd}" ]; then
                                                   >> 127                         objtoolcmd="check"
                                                   >> 128                 fi
                                                   >> 129                 objtoolopt="${objtoolopt} --vmlinux"
                                                   >> 130                 if [ -z "${CONFIG_FRAME_POINTER}" ]; then
                                                   >> 131                         objtoolopt="${objtoolopt} --no-fp"
                                                   >> 132                 fi
                                                   >> 133                 if [ -n "${CONFIG_GCOV_KERNEL}" ] || [ -n "${CONFIG_LTO_CLANG}" ]; then
                                                   >> 134                         objtoolopt="${objtoolopt} --no-unreachable"
                                                   >> 135                 fi
                                                   >> 136                 if [ -n "${CONFIG_RETPOLINE}" ]; then
                                                   >> 137                         objtoolopt="${objtoolopt} --retpoline"
                                                   >> 138                 fi
                                                   >> 139                 if [ -n "${CONFIG_X86_SMAP}" ]; then
                                                   >> 140                         objtoolopt="${objtoolopt} --uaccess"
                                                   >> 141                 fi
                                                   >> 142                 info OBJTOOL ${1}
                                                   >> 143                 tools/objtool/objtool ${objtoolcmd} ${objtoolopt} ${1}
 87         fi                                        144         fi
                                                   >> 145 }
 88                                                   146 
 89         ldflags="${ldflags} ${wl}--script=${ob !! 147 # Link of vmlinux
                                                   >> 148 # ${1} - output file
                                                   >> 149 # ${2}, ${3}, ... - optional extra .o files
                                                   >> 150 vmlinux_link()
                                                   >> 151 {
                                                   >> 152         local lds="${objtree}/${KBUILD_LDS}"
                                                   >> 153         local output=${1}
                                                   >> 154         local objects
                                                   >> 155         local strip_debug
                                                   >> 156         local map_option
                                                   >> 157 
                                                   >> 158         info LD ${output}
                                                   >> 159 
                                                   >> 160         # skip output file argument
                                                   >> 161         shift
 90                                                   162 
 91         # The kallsyms linking does not need d    163         # The kallsyms linking does not need debug symbols included.
 92         if [ -n "${strip_debug}" ] ; then      !! 164         if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then
 93                 ldflags="${ldflags} ${wl}--str !! 165                 strip_debug=-Wl,--strip-debug
 94         fi                                        166         fi
 95                                                   167 
 96         if is_enabled CONFIG_VMLINUX_MAP; then !! 168         if [ -n "${CONFIG_VMLINUX_MAP}" ]; then
 97                 ldflags="${ldflags} ${wl}-Map= !! 169                 map_option="-Map=${output}.map"
 98         fi                                        170         fi
 99                                                   171 
100         ${ld} ${ldflags} -o ${output}          !! 172         if [ "${SRCARCH}" != "um" ]; then
101                 ${wl}--whole-archive ${objs} $ !! 173                 if [ -n "${CONFIG_LTO_CLANG}" ]; then
102                 ${wl}--start-group ${libs} ${w !! 174                         # Use vmlinux.o instead of performing the slow LTO
103                 ${kallsymso} ${btf_vmlinux_bin !! 175                         # link again.
                                                   >> 176                         objects="--whole-archive                \
                                                   >> 177                                 vmlinux.o                       \
                                                   >> 178                                 --no-whole-archive              \
                                                   >> 179                                 ${@}"
                                                   >> 180                 else
                                                   >> 181                         objects="--whole-archive                \
                                                   >> 182                                 ${KBUILD_VMLINUX_OBJS}          \
                                                   >> 183                                 --no-whole-archive              \
                                                   >> 184                                 --start-group                   \
                                                   >> 185                                 ${KBUILD_VMLINUX_LIBS}          \
                                                   >> 186                                 --end-group                     \
                                                   >> 187                                 ${@}"
                                                   >> 188                 fi
                                                   >> 189 
                                                   >> 190                 ${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux}      \
                                                   >> 191                         ${strip_debug#-Wl,}                     \
                                                   >> 192                         -o ${output}                            \
                                                   >> 193                         ${map_option}                           \
                                                   >> 194                         -T ${lds} ${objects}
                                                   >> 195         else
                                                   >> 196                 objects="-Wl,--whole-archive                    \
                                                   >> 197                         ${KBUILD_VMLINUX_OBJS}                  \
                                                   >> 198                         -Wl,--no-whole-archive                  \
                                                   >> 199                         -Wl,--start-group                       \
                                                   >> 200                         ${KBUILD_VMLINUX_LIBS}                  \
                                                   >> 201                         -Wl,--end-group                         \
                                                   >> 202                         ${@}"
                                                   >> 203 
                                                   >> 204                 ${CC} ${CFLAGS_vmlinux}                         \
                                                   >> 205                         ${strip_debug}                          \
                                                   >> 206                         -o ${output}                            \
                                                   >> 207                         ${map_option:+-Wl,${map_option}}        \
                                                   >> 208                         -Wl,-T,${lds}                           \
                                                   >> 209                         ${objects}                              \
                                                   >> 210                         -lutil -lrt -lpthread
                                                   >> 211                 rm -f linux
                                                   >> 212         fi
104 }                                                 213 }
105                                                   214 
106 # generate .BTF typeinfo from DWARF debuginfo     215 # generate .BTF typeinfo from DWARF debuginfo
107 # ${1} - vmlinux image                            216 # ${1} - vmlinux image
                                                   >> 217 # ${2} - file to dump raw BTF data into
108 gen_btf()                                         218 gen_btf()
109 {                                                 219 {
110         local pahole_ver                          220         local pahole_ver
111         local btf_data=${1}.btf.o              !! 221         local extra_paholeopt=
112                                                   222 
113         if ! [ -x "$(command -v ${PAHOLE})" ];    223         if ! [ -x "$(command -v ${PAHOLE})" ]; then
114                 echo >&2 "BTF: ${1}: pahole ($    224                 echo >&2 "BTF: ${1}: pahole (${PAHOLE}) is not available"
115                 return 1                          225                 return 1
116         fi                                        226         fi
117                                                   227 
118         pahole_ver=$(${PAHOLE} --version | sed    228         pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/')
119         if [ "${pahole_ver}" -lt "116" ]; then    229         if [ "${pahole_ver}" -lt "116" ]; then
120                 echo >&2 "BTF: ${1}: pahole ve    230                 echo >&2 "BTF: ${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.16"
121                 return 1                          231                 return 1
122         fi                                        232         fi
123                                                   233 
124         info BTF "${btf_data}"                 !! 234         vmlinux_link ${1}
125         LLVM_OBJCOPY="${OBJCOPY}" ${PAHOLE} -J !! 235 
                                                   >> 236         if [ "${pahole_ver}" -ge "118" ] && [ "${pahole_ver}" -le "121" ]; then
                                                   >> 237                 # pahole 1.18 through 1.21 can't handle zero-sized per-CPU vars
                                                   >> 238                 extra_paholeopt="${extra_paholeopt} --skip_encoding_btf_vars"
                                                   >> 239         fi
                                                   >> 240         if [ "${pahole_ver}" -ge "121" ]; then
                                                   >> 241                 extra_paholeopt="${extra_paholeopt} --btf_gen_floats"
                                                   >> 242         fi
                                                   >> 243 
                                                   >> 244         info "BTF" ${2}
                                                   >> 245         LLVM_OBJCOPY="${OBJCOPY}" ${PAHOLE} -J ${extra_paholeopt} ${1}
126                                                   246 
127         # Create ${btf_data} which contains ju !! 247         # Create ${2} which contains just .BTF section but no symbols. Add
128         # SHF_ALLOC because .BTF will be part     248         # SHF_ALLOC because .BTF will be part of the vmlinux image. --strip-all
129         # deletes all symbols including __star    249         # deletes all symbols including __start_BTF and __stop_BTF, which will
130         # be redefined in the linker script. A    250         # be redefined in the linker script. Add 2>/dev/null to suppress GNU
131         # objcopy warnings: "empty loadable se    251         # objcopy warnings: "empty loadable segment detected at ..."
132         ${OBJCOPY} --only-section=.BTF --set-s    252         ${OBJCOPY} --only-section=.BTF --set-section-flags .BTF=alloc,readonly \
133                 --strip-all ${1} "${btf_data}" !! 253                 --strip-all ${1} ${2} 2>/dev/null
134         # Change e_type to ET_REL so that it c    254         # Change e_type to ET_REL so that it can be used to link final vmlinux.
135         # GNU ld 2.35+ and lld do not allow an !! 255         # Unlike GNU ld, lld does not allow an ET_EXEC input.
136         if is_enabled CONFIG_CPU_BIG_ENDIAN; t !! 256         printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 status=none
137                 et_rel='\0\1'                  << 
138         else                                   << 
139                 et_rel='\1\0'                  << 
140         fi                                     << 
141         printf "${et_rel}" | dd of="${btf_data << 
142                                                << 
143         btf_vmlinux_bin_o=${btf_data}          << 
144 }                                                 257 }
145                                                   258 
146 # Create ${2}.o file with all symbols from the !! 259 # Create ${2} .S file with all symbols from the ${1} object file
147 kallsyms()                                        260 kallsyms()
148 {                                                 261 {
149         local kallsymopt;                         262         local kallsymopt;
150                                                   263 
151         if is_enabled CONFIG_KALLSYMS_ALL; the !! 264         if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
152                 kallsymopt="${kallsymopt} --al    265                 kallsymopt="${kallsymopt} --all-symbols"
153         fi                                        266         fi
154                                                   267 
155         if is_enabled CONFIG_KALLSYMS_ABSOLUTE !! 268         if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then
156                 kallsymopt="${kallsymopt} --ab    269                 kallsymopt="${kallsymopt} --absolute-percpu"
157         fi                                        270         fi
158                                                   271 
159         info KSYMS "${2}.S"                    !! 272         if [ -n "${CONFIG_KALLSYMS_BASE_RELATIVE}" ]; then
160         scripts/kallsyms ${kallsymopt} "${1}"  !! 273                 kallsymopt="${kallsymopt} --base-relative"
161                                                !! 274         fi
162         info AS "${2}.o"                       << 
163         ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE << 
164               ${KBUILD_AFLAGS} ${KBUILD_AFLAGS << 
165                                                   275 
166         kallsymso=${2}.o                       !! 276         info KSYMS ${2}
                                                   >> 277         ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2}
167 }                                                 278 }
168                                                   279 
169 # Perform kallsyms for the given temporary vml !! 280 # Perform one step in kallsyms generation, including temporary linking of
170 sysmap_and_kallsyms()                          !! 281 # vmlinux.
                                                   >> 282 kallsyms_step()
171 {                                                 283 {
172         mksysmap "${1}" "${1}.syms"            !! 284         kallsymso_prev=${kallsymso}
173         kallsyms "${1}.syms" "${1}.kallsyms"   !! 285         kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1}
                                                   >> 286         kallsymso=${kallsyms_vmlinux}.o
                                                   >> 287         kallsyms_S=${kallsyms_vmlinux}.S
174                                                   288 
175         kallsyms_sysmap=${1}.syms              !! 289         vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o}
                                                   >> 290         kallsyms ${kallsyms_vmlinux} ${kallsyms_S}
                                                   >> 291 
                                                   >> 292         info AS ${kallsyms_S}
                                                   >> 293         ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \
                                                   >> 294               ${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
                                                   >> 295               -c -o ${kallsymso} ${kallsyms_S}
176 }                                                 296 }
177                                                   297 
178 # Create map file with all symbols from ${1}      298 # Create map file with all symbols from ${1}
179 # See mksymap for additional details              299 # See mksymap for additional details
180 mksysmap()                                        300 mksysmap()
181 {                                                 301 {
182         info NM ${2}                           !! 302         ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
183         ${NM} -n "${1}" | sed -f "${srctree}/s << 
184 }                                                 303 }
185                                                   304 
186 sorttable()                                       305 sorttable()
187 {                                                 306 {
188         ${objtree}/scripts/sorttable ${1}         307         ${objtree}/scripts/sorttable ${1}
189 }                                                 308 }
190                                                   309 
                                                   >> 310 # Delete output files in case of error
191 cleanup()                                         311 cleanup()
192 {                                                 312 {
193         rm -f .btf.*                              313         rm -f .btf.*
                                                   >> 314         rm -f .tmp_System.map
                                                   >> 315         rm -f .tmp_initcalls.lds
                                                   >> 316         rm -f .tmp_symversions.lds
                                                   >> 317         rm -f .tmp_vmlinux*
194         rm -f System.map                          318         rm -f System.map
195         rm -f vmlinux                             319         rm -f vmlinux
196         rm -f vmlinux.map                         320         rm -f vmlinux.map
                                                   >> 321         rm -f vmlinux.o
                                                   >> 322         rm -f .vmlinux.d
197 }                                                 323 }
198                                                   324 
199 # Use "make V=1" to debug this script             325 # Use "make V=1" to debug this script
200 case "${KBUILD_VERBOSE}" in                       326 case "${KBUILD_VERBOSE}" in
201 *1*)                                              327 *1*)
202         set -x                                    328         set -x
203         ;;                                        329         ;;
204 esac                                              330 esac
205                                                   331 
206 if [ "$1" = "clean" ]; then                       332 if [ "$1" = "clean" ]; then
207         cleanup                                   333         cleanup
208         exit 0                                    334         exit 0
209 fi                                                335 fi
210                                                   336 
211 ${MAKE} -f "${srctree}/scripts/Makefile.build" !! 337 # We need access to CONFIG_ symbols
                                                   >> 338 . include/config/auto.conf
212                                                   339 
213 btf_vmlinux_bin_o=                             !! 340 # Update version
214 kallsymso=                                     !! 341 info GEN .version
215 strip_debug=                                   !! 342 if [ -r .version ]; then
216                                                !! 343         VERSION=$(expr 0$(cat .version) + 1)
217 if is_enabled CONFIG_KALLSYMS; then            !! 344         echo $VERSION > .version
218         truncate -s0 .tmp_vmlinux.kallsyms0.sy !! 345 else
219         kallsyms .tmp_vmlinux.kallsyms0.syms . !! 346         rm -f .version
220 fi                                             !! 347         echo 1 > .version
221                                                !! 348 fi;
222 if is_enabled CONFIG_KALLSYMS || is_enabled CO !! 349 
223                                                !! 350 # final build of init/
224         # The kallsyms linking does not need d !! 351 ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1
225         if ! is_enabled CONFIG_DEBUG_INFO_BTF; !! 352 
226                 strip_debug=1                  !! 353 #link vmlinux.o
227         fi                                     !! 354 modpost_link vmlinux.o
228                                                !! 355 objtool_link vmlinux.o
229         vmlinux_link .tmp_vmlinux1             !! 356 
230 fi                                             !! 357 # modpost vmlinux.o to check for section mismatches
231                                                !! 358 ${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1
232 if is_enabled CONFIG_DEBUG_INFO_BTF; then      !! 359 
233         if ! gen_btf .tmp_vmlinux1; then       !! 360 info MODINFO modules.builtin.modinfo
                                                   >> 361 ${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo
                                                   >> 362 info GEN modules.builtin
                                                   >> 363 # The second line aids cases where multiple modules share the same object.
                                                   >> 364 tr '\0' '\n' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' |
                                                   >> 365         tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin
                                                   >> 366 
                                                   >> 367 btf_vmlinux_bin_o=""
                                                   >> 368 if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then
                                                   >> 369         btf_vmlinux_bin_o=.btf.vmlinux.bin.o
                                                   >> 370         if ! gen_btf .tmp_vmlinux.btf $btf_vmlinux_bin_o ; then
234                 echo >&2 "Failed to generate B    371                 echo >&2 "Failed to generate BTF for vmlinux"
235                 echo >&2 "Try to disable CONFI    372                 echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF"
236                 exit 1                            373                 exit 1
237         fi                                        374         fi
238 fi                                                375 fi
239                                                   376 
240 if is_enabled CONFIG_KALLSYMS; then            !! 377 kallsymso=""
                                                   >> 378 kallsymso_prev=""
                                                   >> 379 kallsyms_vmlinux=""
                                                   >> 380 if [ -n "${CONFIG_KALLSYMS}" ]; then
241                                                   381 
242         # kallsyms support                        382         # kallsyms support
243         # Generate section listing all symbols    383         # Generate section listing all symbols and add it into vmlinux
244         # It's a four step process:            !! 384         # It's a three step process:
245         # 0)  Generate a dummy __kallsyms with !! 385         # 1)  Link .tmp_vmlinux1 so it has all symbols and sections,
246         # 1)  Link .tmp_vmlinux.kallsyms1 so i !! 386         #     but __kallsyms is empty.
247         #     with a dummy __kallsyms.         << 
248         #     Running kallsyms on that gives u    387         #     Running kallsyms on that gives us .tmp_kallsyms1.o with
249         #     the right size                      388         #     the right size
250         # 2)  Link .tmp_vmlinux.kallsyms2 so i !! 389         # 2)  Link .tmp_vmlinux2 so it now has a __kallsyms section of
251         #     the right size, but due to the a    390         #     the right size, but due to the added section, some
252         #     addresses have shifted.             391         #     addresses have shifted.
253         #     From here, we generate a correct !! 392         #     From here, we generate a correct .tmp_kallsyms2.o
254         # 3)  That link may have expanded the     393         # 3)  That link may have expanded the kernel image enough that
255         #     more linker branch stubs / tramp    394         #     more linker branch stubs / trampolines had to be added, which
256         #     introduces new names, which furt    395         #     introduces new names, which further expands kallsyms. Do another
257         #     pass if that is the case. In the    396         #     pass if that is the case. In theory it's possible this results
258         #     in even more stubs, but unlikely    397         #     in even more stubs, but unlikely.
259         #     KALLSYMS_EXTRA_PASS=1 may also u    398         #     KALLSYMS_EXTRA_PASS=1 may also used to debug or work around
260         #     other bugs.                         399         #     other bugs.
261         # 4)  The correct ${kallsymso} is link    400         # 4)  The correct ${kallsymso} is linked into the final vmlinux.
262         #                                         401         #
263         # a)  Verify that the System.map from     402         # a)  Verify that the System.map from vmlinux matches the map from
264         #     ${kallsymso}.                       403         #     ${kallsymso}.
265                                                   404 
266         # The kallsyms linking does not need d !! 405         kallsyms_step 1
267         strip_debug=1                          !! 406         kallsyms_step 2
268                                                << 
269         sysmap_and_kallsyms .tmp_vmlinux1      << 
270         size1=$(${CONFIG_SHELL} "${srctree}/sc << 
271                                                   407 
272         vmlinux_link .tmp_vmlinux2             !! 408         # step 3
273         sysmap_and_kallsyms .tmp_vmlinux2      !! 409         size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso_prev})
274         size2=$(${CONFIG_SHELL} "${srctree}/sc    410         size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso})
275                                                   411 
276         if [ $size1 -ne $size2 ] || [ -n "${KA    412         if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
277                 vmlinux_link .tmp_vmlinux3     !! 413                 kallsyms_step 3
278                 sysmap_and_kallsyms .tmp_vmlin << 
279         fi                                        414         fi
280 fi                                                415 fi
281                                                   416 
282 strip_debug=                                   !! 417 vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o}
283                                                << 
284 vmlinux_link vmlinux                           << 
285                                                   418 
286 # fill in BTF IDs                                 419 # fill in BTF IDs
287 if is_enabled CONFIG_DEBUG_INFO_BTF && is_enab !! 420 if [ -n "${CONFIG_DEBUG_INFO_BTF}" -a -n "${CONFIG_BPF}" ]; then
288         info BTFIDS vmlinux                       421         info BTFIDS vmlinux
289         ${RESOLVE_BTFIDS} vmlinux                 422         ${RESOLVE_BTFIDS} vmlinux
290 fi                                                423 fi
291                                                   424 
292 mksysmap vmlinux System.map                    !! 425 if [ -n "${CONFIG_BUILDTIME_TABLE_SORT}" ]; then
293                                                << 
294 if is_enabled CONFIG_BUILDTIME_TABLE_SORT; the << 
295         info SORTTAB vmlinux                      426         info SORTTAB vmlinux
296         if ! sorttable vmlinux; then              427         if ! sorttable vmlinux; then
297                 echo >&2 Failed to sort kernel    428                 echo >&2 Failed to sort kernel tables
298                 exit 1                            429                 exit 1
299         fi                                        430         fi
300 fi                                                431 fi
301                                                   432 
                                                   >> 433 info SYSMAP System.map
                                                   >> 434 mksysmap vmlinux System.map
                                                   >> 435 
302 # step a (see comment above)                      436 # step a (see comment above)
303 if is_enabled CONFIG_KALLSYMS; then            !! 437 if [ -n "${CONFIG_KALLSYMS}" ]; then
304         if ! cmp -s System.map "${kallsyms_sys !! 438         mksysmap ${kallsyms_vmlinux} .tmp_System.map
                                                   >> 439 
                                                   >> 440         if ! cmp -s System.map .tmp_System.map; then
305                 echo >&2 Inconsistent kallsyms    441                 echo >&2 Inconsistent kallsyms data
306                 echo >&2 'Try "make KALLSYMS_E !! 442                 echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
307                 exit 1                            443                 exit 1
308         fi                                        444         fi
309 fi                                                445 fi
310                                                   446 
311 # For fixdep                                      447 # For fixdep
312 echo "vmlinux: $0" > .vmlinux.d                   448 echo "vmlinux: $0" > .vmlinux.d
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php