11f2bfbd0SSam Ravnborg#!/bin/sh 2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 31f2bfbd0SSam Ravnborg# 41f2bfbd0SSam Ravnborg# link vmlinux 51f2bfbd0SSam Ravnborg# 632164845SMasahiro Yamada# vmlinux is linked from the objects in vmlinux.a and $(KBUILD_VMLINUX_LIBS). 732164845SMasahiro Yamada# vmlinux.a contains objects that are linked unconditionally. 8d151e971SMasahiro Yamada# $(KBUILD_VMLINUX_LIBS) are archives which are linked conditionally 9d151e971SMasahiro Yamada# (not within --whole-archive), and do not require symbol indexes added. 101f2bfbd0SSam Ravnborg# 111f2bfbd0SSam Ravnborg# vmlinux 121f2bfbd0SSam Ravnborg# ^ 131f2bfbd0SSam Ravnborg# | 1432164845SMasahiro Yamada# +--< vmlinux.a 151f2bfbd0SSam Ravnborg# | 163a166fc2SNicholas Piggin# +--< $(KBUILD_VMLINUX_LIBS) 173a166fc2SNicholas Piggin# | +--< lib/lib.a + more 183a166fc2SNicholas Piggin# | 191f2bfbd0SSam Ravnborg# +-< ${kallsymso} (see description in KALLSYMS section) 201f2bfbd0SSam Ravnborg# 211f2bfbd0SSam Ravnborg# vmlinux version (uname -v) cannot be updated during normal 221f2bfbd0SSam Ravnborg# descending-into-subdirs phase since we do not yet know if we need to 231f2bfbd0SSam Ravnborg# update vmlinux. 241f2bfbd0SSam Ravnborg# Therefore this step is delayed until just before final link of vmlinux. 251f2bfbd0SSam Ravnborg# 261f2bfbd0SSam Ravnborg# System.map is generated to document addresses of all kernel symbols 271f2bfbd0SSam Ravnborg 281f2bfbd0SSam Ravnborg# Error out on error 291f2bfbd0SSam Ravnborgset -e 301f2bfbd0SSam Ravnborg 313ec8a5b3SMasahiro YamadaLD="$1" 323ec8a5b3SMasahiro YamadaKBUILD_LDFLAGS="$2" 333ec8a5b3SMasahiro YamadaLDFLAGS_vmlinux="$3" 34*e22bbb8eSArd BiesheuvelVMLINUX="$4" 353ec8a5b3SMasahiro Yamada 367d153696SMasahiro Yamadais_enabled() { 377d153696SMasahiro Yamada grep -q "^$1=y" include/config/auto.conf 387d153696SMasahiro Yamada} 397d153696SMasahiro Yamada 401f2bfbd0SSam Ravnborg# Nice output in kbuild format 411f2bfbd0SSam Ravnborg# Will be supressed by "make -s" 421f2bfbd0SSam Ravnborginfo() 431f2bfbd0SSam Ravnborg{ 44e83b9f55SAndrii Nakryiko printf " %-7s %s\n" "${1}" "${2}" 451f2bfbd0SSam Ravnborg} 461f2bfbd0SSam Ravnborg 471f2bfbd0SSam Ravnborg# Link of vmlinux 48341dfcf8SAndrii Nakryiko# ${1} - output file 491f2bfbd0SSam Ravnborgvmlinux_link() 501f2bfbd0SSam Ravnborg{ 51618916a4SAndrii Nakryiko local output=${1} 528f130512SMasahiro Yamada local objs 538f130512SMasahiro Yamada local libs 545df77ad6SMasahiro Yamada local ld 555df77ad6SMasahiro Yamada local ldflags 565df77ad6SMasahiro Yamada local ldlibs 571f2bfbd0SSam Ravnborg 58d7b0827fSLinus Torvalds info LD ${output} 59d7b0827fSLinus Torvalds 60618916a4SAndrii Nakryiko # skip output file argument 61618916a4SAndrii Nakryiko shift 62618916a4SAndrii Nakryiko 63ed53a0d9SPeter Zijlstra if is_enabled CONFIG_LTO_CLANG || is_enabled CONFIG_X86_KERNEL_IBT; then 648f130512SMasahiro Yamada # Use vmlinux.o instead of performing the slow LTO link again. 658f130512SMasahiro Yamada objs=vmlinux.o 668f130512SMasahiro Yamada libs= 678f130512SMasahiro Yamada else 6832164845SMasahiro Yamada objs=vmlinux.a 698f130512SMasahiro Yamada libs="${KBUILD_VMLINUX_LIBS}" 708f130512SMasahiro Yamada fi 718f130512SMasahiro Yamada 72654102dfSMasahiro Yamada if is_enabled CONFIG_GENERIC_BUILTIN_DTB; then 73654102dfSMasahiro Yamada objs="${objs} .builtin-dtbs.o" 74654102dfSMasahiro Yamada fi 75654102dfSMasahiro Yamada 767b453719SMasahiro Yamada if is_enabled CONFIG_MODULES; then 777b453719SMasahiro Yamada objs="${objs} .vmlinux.export.o" 787b453719SMasahiro Yamada fi 797b453719SMasahiro Yamada 802df8220cSMasahiro Yamada objs="${objs} init/version-timestamp.o" 812df8220cSMasahiro Yamada 825df77ad6SMasahiro Yamada if [ "${SRCARCH}" = "um" ]; then 835df77ad6SMasahiro Yamada wl=-Wl, 845df77ad6SMasahiro Yamada ld="${CC}" 855df77ad6SMasahiro Yamada ldflags="${CFLAGS_vmlinux}" 865df77ad6SMasahiro Yamada ldlibs="-lutil -lrt -lpthread" 875df77ad6SMasahiro Yamada else 885df77ad6SMasahiro Yamada wl= 895df77ad6SMasahiro Yamada ld="${LD}" 905df77ad6SMasahiro Yamada ldflags="${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux}" 915df77ad6SMasahiro Yamada ldlibs= 925df77ad6SMasahiro Yamada fi 935df77ad6SMasahiro Yamada 945df77ad6SMasahiro Yamada ldflags="${ldflags} ${wl}--script=${objtree}/${KBUILD_LDS}" 955df77ad6SMasahiro Yamada 96af73d78bSKees Cook # The kallsyms linking does not need debug symbols included. 97ddf41329SMasahiro Yamada if [ -n "${strip_debug}" ] ; then 985df77ad6SMasahiro Yamada ldflags="${ldflags} ${wl}--strip-debug" 99af73d78bSKees Cook fi 100af73d78bSKees Cook 101ba4d7050SMasahiro Yamada if [ -n "${generate_map}" ]; then 102ba4d7050SMasahiro Yamada ldflags="${ldflags} ${wl}-Map=vmlinux.map" 1035cc12472SRasmus Villemoes fi 1045cc12472SRasmus Villemoes 1055df77ad6SMasahiro Yamada ${ld} ${ldflags} -o ${output} \ 1065df77ad6SMasahiro Yamada ${wl}--whole-archive ${objs} ${wl}--no-whole-archive \ 1075df77ad6SMasahiro Yamada ${wl}--start-group ${libs} ${wl}--end-group \ 1081198c9c6SNaveen N Rao ${kallsymso} ${btf_vmlinux_bin_o} ${arch_vmlinux_o} ${ldlibs} 1091f2bfbd0SSam Ravnborg} 1101f2bfbd0SSam Ravnborg 111e83b9f55SAndrii Nakryiko# generate .BTF typeinfo from DWARF debuginfo 112341dfcf8SAndrii Nakryiko# ${1} - vmlinux image 113e83b9f55SAndrii Nakryikogen_btf() 114e83b9f55SAndrii Nakryiko{ 115b1a9a5e0SMasahiro Yamada local btf_data=${1}.btf.o 116e83b9f55SAndrii Nakryiko 117ddf41329SMasahiro Yamada info BTF "${btf_data}" 1189741e07eSJiri Olsa LLVM_OBJCOPY="${OBJCOPY}" ${PAHOLE} -J ${PAHOLE_FLAGS} ${1} 119341dfcf8SAndrii Nakryiko 120ddf41329SMasahiro Yamada # Create ${btf_data} which contains just .BTF section but no symbols. Add 12190ceddcbSFangrui Song # SHF_ALLOC because .BTF will be part of the vmlinux image. --strip-all 12290ceddcbSFangrui Song # deletes all symbols including __start_BTF and __stop_BTF, which will 12390ceddcbSFangrui Song # be redefined in the linker script. Add 2>/dev/null to suppress GNU 12490ceddcbSFangrui Song # objcopy warnings: "empty loadable segment detected at ..." 12590ceddcbSFangrui Song ${OBJCOPY} --only-section=.BTF --set-section-flags .BTF=alloc,readonly \ 126ddf41329SMasahiro Yamada --strip-all ${1} "${btf_data}" 2>/dev/null 12790ceddcbSFangrui Song # Change e_type to ET_REL so that it can be used to link final vmlinux. 128e3a9ee96SNathan Chancellor # GNU ld 2.35+ and lld do not allow an ET_EXEC input. 129e3a9ee96SNathan Chancellor if is_enabled CONFIG_CPU_BIG_ENDIAN; then 130e3a9ee96SNathan Chancellor et_rel='\0\1' 131e3a9ee96SNathan Chancellor else 132e3a9ee96SNathan Chancellor et_rel='\1\0' 133e3a9ee96SNathan Chancellor fi 134ddf41329SMasahiro Yamada printf "${et_rel}" | dd of="${btf_data}" conv=notrunc bs=1 seek=16 status=none 135ddf41329SMasahiro Yamada 136ddf41329SMasahiro Yamada btf_vmlinux_bin_o=${btf_data} 137e83b9f55SAndrii Nakryiko} 1381f2bfbd0SSam Ravnborg 139ddf41329SMasahiro Yamada# Create ${2}.o file with all symbols from the ${1} object file 1401f2bfbd0SSam Ravnborgkallsyms() 1411f2bfbd0SSam Ravnborg{ 1421f2bfbd0SSam Ravnborg local kallsymopt; 1431f2bfbd0SSam Ravnborg 1447d153696SMasahiro Yamada if is_enabled CONFIG_KALLSYMS_ALL; then 1456895f97eSJames Hogan kallsymopt="${kallsymopt} --all-symbols" 1461f2bfbd0SSam Ravnborg fi 1471f2bfbd0SSam Ravnborg 1487d153696SMasahiro Yamada info KSYMS "${2}.S" 149c6bda7c9SRusty Russell scripts/kallsyms ${kallsymopt} "${1}" > "${2}.S" 150c6bda7c9SRusty Russell 151c6bda7c9SRusty Russell info AS "${2}.o" 152ddf41329SMasahiro Yamada ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \ 153ddf41329SMasahiro Yamada ${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} -c -o "${2}.o" "${2}.S" 154ddf41329SMasahiro Yamada 155ddf41329SMasahiro Yamada kallsymso=${2}.o 156ddf41329SMasahiro Yamada} 157ddf41329SMasahiro Yamada 158ddf41329SMasahiro Yamada# Perform kallsyms for the given temporary vmlinux. 159ddf41329SMasahiro Yamadasysmap_and_kallsyms() 1601f2bfbd0SSam Ravnborg{ 1611f2bfbd0SSam Ravnborg mksysmap "${1}" "${1}.syms" 162b1a9a5e0SMasahiro Yamada kallsyms "${1}.syms" "${1}.kallsyms" 163b1a9a5e0SMasahiro Yamada 1648959e392SKees Cook kallsyms_sysmap=${1}.syms 165b1a9a5e0SMasahiro Yamada} 166b1a9a5e0SMasahiro Yamada 1678959e392SKees Cook# Create map file with all symbols from ${1} 168b1a9a5e0SMasahiro Yamada# See mksymap for additional details 1698959e392SKees Cookmksysmap() 1708959e392SKees Cook{ 1711f2bfbd0SSam Ravnborg info NM ${2} 1721f2bfbd0SSam Ravnborg ${NM} -n "${1}" | sed -f "${srctree}/scripts/mksysmap" > "${2}" 1731f2bfbd0SSam Ravnborg} 1741f2bfbd0SSam Ravnborg 17594ff2f63SMasahiro Yamadasorttable() 17696c96566SRichard Acayan{ 1771f2bfbd0SSam Ravnborg ${NM} -S ${1} > .tmp_vmlinux.nm-sort 1781f2bfbd0SSam Ravnborg ${objtree}/scripts/sorttable -s .tmp_vmlinux.nm-sort ${1} 17910916706SShile Zhang} 1801347a2ceSLinus Torvalds 18110916706SShile Zhangcleanup() 1821347a2ceSLinus Torvalds{ 1831347a2ceSLinus Torvalds rm -f .btf.* 1841f2bfbd0SSam Ravnborg rm -f .tmp_vmlinux.nm-sort 1851f2bfbd0SSam Ravnborg rm -f System.map 186341dfcf8SAndrii Nakryiko rm -f vmlinux 1871f2bfbd0SSam Ravnborg rm -f vmlinux.map 1881f2bfbd0SSam Ravnborg} 1895cc12472SRasmus Villemoes 1901f2bfbd0SSam Ravnborg# Use "make V=1" to debug this script 1911f2bfbd0SSam Ravnborgcase "${KBUILD_VERBOSE}" in 1921f2bfbd0SSam Ravnborg*1*) 1931f2bfbd0SSam Ravnborg set -x 1941f2bfbd0SSam Ravnborg ;; 1951f2bfbd0SSam Ravnborgesac 1961f2bfbd0SSam Ravnborg 1971f2bfbd0SSam Ravnborgif [ "$1" = "clean" ]; then 1981f2bfbd0SSam Ravnborg cleanup 1991f2bfbd0SSam Ravnborg exit 0 2001f2bfbd0SSam Ravnborgfi 2011f2bfbd0SSam Ravnborg 2021f2bfbd0SSam Ravnborg${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init init/version-timestamp.o 2031f2bfbd0SSam Ravnborg 2042df8220cSMasahiro Yamadaarch_vmlinux_o= 2052df8220cSMasahiro Yamadaif is_enabled CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX; then 2061198c9c6SNaveen N Rao arch_vmlinux_o=arch/${SRCARCH}/tools/vmlinux.arch.o 2071198c9c6SNaveen N Raofi 2081198c9c6SNaveen N Rao 2091198c9c6SNaveen N Raobtf_vmlinux_bin_o= 2101198c9c6SNaveen N Raokallsymso= 211ddf41329SMasahiro Yamadastrip_debug= 212ddf41329SMasahiro Yamadagenerate_map= 213ddf41329SMasahiro Yamada 214ba4d7050SMasahiro Yamadaif is_enabled CONFIG_KALLSYMS; then 215ddf41329SMasahiro Yamada true > .tmp_vmlinux0.syms 216c442db3fSMasahiro Yamada kallsyms .tmp_vmlinux0.syms .tmp_vmlinux0.kallsyms 217e6064da6SSedat Dilekfi 218e6064da6SSedat Dilek 219b1a9a5e0SMasahiro Yamadaif is_enabled CONFIG_KALLSYMS || is_enabled CONFIG_DEBUG_INFO_BTF; then 220b1a9a5e0SMasahiro Yamada 221b1a9a5e0SMasahiro Yamada # The kallsyms linking does not need debug symbols, but the BTF does. 222b1a9a5e0SMasahiro Yamada if ! is_enabled CONFIG_DEBUG_INFO_BTF; then 223b1a9a5e0SMasahiro Yamada strip_debug=1 224b1a9a5e0SMasahiro Yamada fi 225b1a9a5e0SMasahiro Yamada 226b1a9a5e0SMasahiro Yamada vmlinux_link .tmp_vmlinux1 227b1a9a5e0SMasahiro Yamadafi 228b1a9a5e0SMasahiro Yamada 229c442db3fSMasahiro Yamadaif is_enabled CONFIG_DEBUG_INFO_BTF; then 230c442db3fSMasahiro Yamada if ! gen_btf .tmp_vmlinux1; then 2317d153696SMasahiro Yamada echo >&2 "Failed to generate BTF for vmlinux" 232b1a9a5e0SMasahiro Yamada echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF" 233da5fb182SStanislav Fomichev exit 1 234da5fb182SStanislav Fomichev fi 235da5fb182SStanislav Fomichevfi 236341dfcf8SAndrii Nakryiko 237341dfcf8SAndrii Nakryikoif is_enabled CONFIG_KALLSYMS; then 238341dfcf8SAndrii Nakryiko 2397d153696SMasahiro Yamada # kallsyms support 2401f2bfbd0SSam Ravnborg # Generate section listing all symbols and add it into vmlinux 2411f2bfbd0SSam Ravnborg # It's a four step process: 2421f2bfbd0SSam Ravnborg # 0) Generate a dummy __kallsyms with empty symbol list. 243c442db3fSMasahiro Yamada # 1) Link .tmp_vmlinux1.kallsyms so it has all symbols and sections, 244c442db3fSMasahiro Yamada # with a dummy __kallsyms. 245e6064da6SSedat Dilek # Running kallsyms on that gives us .tmp_vmlinux1.kallsyms.o with 246c442db3fSMasahiro Yamada # the right size 247e6064da6SSedat Dilek # 2) Link .tmp_vmlinux2.kallsyms so it now has a __kallsyms section of 2481f2bfbd0SSam Ravnborg # the right size, but due to the added section, some 249e6064da6SSedat Dilek # addresses have shifted. 2501f2bfbd0SSam Ravnborg # From here, we generate a correct .tmp_vmlinux2.kallsyms.o 2511f2bfbd0SSam Ravnborg # 3) That link may have expanded the kernel image enough that 252e6064da6SSedat Dilek # more linker branch stubs / trampolines had to be added, which 2537e2b37c9SNicholas Piggin # introduces new names, which further expands kallsyms. Do another 2547e2b37c9SNicholas Piggin # pass if that is the case. In theory it's possible this results 2557e2b37c9SNicholas Piggin # in even more stubs, but unlikely. 2567e2b37c9SNicholas Piggin # KALLSYMS_EXTRA_PASS=1 may also used to debug or work around 2577e2b37c9SNicholas Piggin # other bugs. 2587e2b37c9SNicholas Piggin # 4) The correct ${kallsymso} is linked into the final vmlinux. 2597e2b37c9SNicholas Piggin # 2607e2b37c9SNicholas Piggin # a) Verify that the System.map from vmlinux matches the map from 2611f2bfbd0SSam Ravnborg # ${kallsymso}. 2621f2bfbd0SSam Ravnborg 2631f2bfbd0SSam Ravnborg # The kallsyms linking does not need debug symbols included. 2641f2bfbd0SSam Ravnborg strip_debug=1 265ddf41329SMasahiro Yamada 266ddf41329SMasahiro Yamada sysmap_and_kallsyms .tmp_vmlinux1 2671f2bfbd0SSam Ravnborg size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso}) 268b1a9a5e0SMasahiro Yamada 269ddf41329SMasahiro Yamada vmlinux_link .tmp_vmlinux2 270ddf41329SMasahiro Yamada sysmap_and_kallsyms .tmp_vmlinux2 271b1a9a5e0SMasahiro Yamada size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso}) 272b1a9a5e0SMasahiro Yamada 2738959e392SKees Cook if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then 2747e2b37c9SNicholas Piggin vmlinux_link .tmp_vmlinux3 2757e2b37c9SNicholas Piggin sysmap_and_kallsyms .tmp_vmlinux3 276b1a9a5e0SMasahiro Yamada fi 277b1a9a5e0SMasahiro Yamadafi 2781f2bfbd0SSam Ravnborg 2791f2bfbd0SSam Ravnborgstrip_debug= 2801f2bfbd0SSam Ravnborg 281ddf41329SMasahiro Yamadaif is_enabled CONFIG_VMLINUX_MAP; then 282ddf41329SMasahiro Yamada generate_map=1 283ba4d7050SMasahiro Yamadafi 284ba4d7050SMasahiro Yamada 285ba4d7050SMasahiro Yamadavmlinux_link "${VMLINUX}" 286ba4d7050SMasahiro Yamada 287*e22bbb8eSArd Biesheuvel# fill in BTF IDs 288e83b9f55SAndrii Nakryikoif is_enabled CONFIG_DEBUG_INFO_BTF; then 289c9a0f3b8SJiri Olsa info BTFIDS "${VMLINUX}" 290c980dc9cSMasahiro Yamada RESOLVE_BTFIDS_ARGS="" 291*e22bbb8eSArd Biesheuvel if is_enabled CONFIG_WERROR; then 2926e8ba494SThomas Weißschuh RESOLVE_BTFIDS_ARGS=" --fatal_warnings " 2936e8ba494SThomas Weißschuh fi 2946e8ba494SThomas Weißschuh ${RESOLVE_BTFIDS} ${RESOLVE_BTFIDS_ARGS} "${VMLINUX}" 2956e8ba494SThomas Weißschuhfi 296*e22bbb8eSArd Biesheuvel 297c9a0f3b8SJiri Olsamksysmap "${VMLINUX}" System.map 298c9a0f3b8SJiri Olsa 299*e22bbb8eSArd Biesheuvelif is_enabled CONFIG_BUILDTIME_TABLE_SORT; then 30072b3942aSYinan Liu info SORTTAB "${VMLINUX}" 3017d153696SMasahiro Yamada if ! sorttable "${VMLINUX}"; then 302*e22bbb8eSArd Biesheuvel echo >&2 Failed to sort kernel tables 303*e22bbb8eSArd Biesheuvel exit 1 304f14bf6a3SShile Zhang fi 305f14bf6a3SShile Zhangfi 306f14bf6a3SShile Zhang 3071347a2ceSLinus Torvalds# step a (see comment above) 3081347a2ceSLinus Torvaldsif is_enabled CONFIG_KALLSYMS; then 3091f2bfbd0SSam Ravnborg if ! cmp -s System.map "${kallsyms_sysmap}"; then 3107d153696SMasahiro Yamada echo >&2 Inconsistent kallsyms data 311b1a9a5e0SMasahiro Yamada echo >&2 'Try "make KALLSYMS_EXTRA_PASS=1" as a workaround' 3125369f550SMichal Marek exit 1 3134b3d049fSAndrew Morton fi 3141f2bfbd0SSam Ravnborgfi 3151f2bfbd0SSam Ravnborg 3161f2bfbd0SSam Ravnborg# For fixdep 3170b956e20SRasmus Villemoesecho "${VMLINUX}: $0" > ".${VMLINUX}.d" 3180b956e20SRasmus Villemoes