~ [ 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.18.19)


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