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
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.