0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 set -e
0032
0033 LD="$1"
0034 KBUILD_LDFLAGS="$2"
0035 LDFLAGS_vmlinux="$3"
0036
0037 is_enabled() {
0038 grep -q "^$1=y" include/config/auto.conf
0039 }
0040
0041
0042
0043 info()
0044 {
0045 printf " %-7s %s\n" "${1}" "${2}"
0046 }
0047
0048
0049
0050
0051 vmlinux_link()
0052 {
0053 local output=${1}
0054 local objs
0055 local libs
0056 local ld
0057 local ldflags
0058 local ldlibs
0059
0060 info LD ${output}
0061
0062
0063 shift
0064
0065 if is_enabled CONFIG_LTO_CLANG || is_enabled CONFIG_X86_KERNEL_IBT; then
0066
0067 objs=vmlinux.o
0068 libs=
0069 else
0070 objs="${KBUILD_VMLINUX_OBJS}"
0071 libs="${KBUILD_VMLINUX_LIBS}"
0072 fi
0073
0074 if is_enabled CONFIG_MODULES; then
0075 objs="${objs} .vmlinux.export.o"
0076 fi
0077
0078 if [ "${SRCARCH}" = "um" ]; then
0079 wl=-Wl,
0080 ld="${CC}"
0081 ldflags="${CFLAGS_vmlinux}"
0082 ldlibs="-lutil -lrt -lpthread"
0083 else
0084 wl=
0085 ld="${LD}"
0086 ldflags="${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux}"
0087 ldlibs=
0088 fi
0089
0090 ldflags="${ldflags} ${wl}--script=${objtree}/${KBUILD_LDS}"
0091
0092
0093 if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then
0094 ldflags="${ldflags} ${wl}--strip-debug"
0095 fi
0096
0097 if is_enabled CONFIG_VMLINUX_MAP; then
0098 ldflags="${ldflags} ${wl}-Map=${output}.map"
0099 fi
0100
0101 ${ld} ${ldflags} -o ${output} \
0102 ${wl}--whole-archive ${objs} ${wl}--no-whole-archive \
0103 ${wl}--start-group ${libs} ${wl}--end-group \
0104 $@ ${ldlibs}
0105 }
0106
0107
0108
0109
0110 gen_btf()
0111 {
0112 local pahole_ver
0113
0114 if ! [ -x "$(command -v ${PAHOLE})" ]; then
0115 echo >&2 "BTF: ${1}: pahole (${PAHOLE}) is not available"
0116 return 1
0117 fi
0118
0119 pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/')
0120 if [ "${pahole_ver}" -lt "116" ]; then
0121 echo >&2 "BTF: ${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.16"
0122 return 1
0123 fi
0124
0125 vmlinux_link ${1}
0126
0127 info "BTF" ${2}
0128 LLVM_OBJCOPY="${OBJCOPY}" ${PAHOLE} -J ${PAHOLE_FLAGS} ${1}
0129
0130
0131
0132
0133
0134
0135 ${OBJCOPY} --only-section=.BTF --set-section-flags .BTF=alloc,readonly \
0136 --strip-all ${1} ${2} 2>/dev/null
0137
0138
0139 printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 status=none
0140 }
0141
0142
0143 kallsyms()
0144 {
0145 local kallsymopt;
0146
0147 if is_enabled CONFIG_KALLSYMS_ALL; then
0148 kallsymopt="${kallsymopt} --all-symbols"
0149 fi
0150
0151 if is_enabled CONFIG_KALLSYMS_ABSOLUTE_PERCPU; then
0152 kallsymopt="${kallsymopt} --absolute-percpu"
0153 fi
0154
0155 if is_enabled CONFIG_KALLSYMS_BASE_RELATIVE; then
0156 kallsymopt="${kallsymopt} --base-relative"
0157 fi
0158
0159 info KSYMS ${2}
0160 ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2}
0161 }
0162
0163
0164
0165 kallsyms_step()
0166 {
0167 kallsymso_prev=${kallsymso}
0168 kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1}
0169 kallsymso=${kallsyms_vmlinux}.o
0170 kallsyms_S=${kallsyms_vmlinux}.S
0171
0172 vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o}
0173 kallsyms ${kallsyms_vmlinux} ${kallsyms_S}
0174
0175 info AS ${kallsyms_S}
0176 ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \
0177 ${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
0178 -c -o ${kallsymso} ${kallsyms_S}
0179 }
0180
0181
0182
0183 mksysmap()
0184 {
0185 ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
0186 }
0187
0188 sorttable()
0189 {
0190 ${objtree}/scripts/sorttable ${1}
0191 }
0192
0193
0194 cleanup()
0195 {
0196 rm -f .btf.*
0197 rm -f System.map
0198 rm -f vmlinux
0199 rm -f vmlinux.map
0200 rm -f .vmlinux.objs
0201 rm -f .vmlinux.export.c
0202 }
0203
0204
0205 case "${KBUILD_VERBOSE}" in
0206 *1*)
0207 set -x
0208 ;;
0209 esac
0210
0211 if [ "$1" = "clean" ]; then
0212 cleanup
0213 exit 0
0214 fi
0215
0216
0217 info GEN .version
0218 if [ -r .version ]; then
0219 VERSION=$(expr 0$(cat .version) + 1)
0220 echo $VERSION > .version
0221 else
0222 rm -f .version
0223 echo 1 > .version
0224 fi;
0225
0226
0227 ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1
0228
0229
0230 ${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o"
0231
0232
0233
0234
0235 for f in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do
0236 case ${f} in
0237 *libgcc.a)
0238
0239
0240
0241 ;;
0242 *.a)
0243 ${AR} t ${f} ;;
0244 *)
0245 echo ${f} ;;
0246 esac
0247 done > .vmlinux.objs
0248
0249
0250 ${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1
0251
0252 info MODINFO modules.builtin.modinfo
0253 ${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo
0254 info GEN modules.builtin
0255
0256 tr '\0' '\n' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' |
0257 tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin
0258
0259 if is_enabled CONFIG_MODULES; then
0260 ${MAKE} -f "${srctree}/scripts/Makefile.vmlinux" .vmlinux.export.o
0261 fi
0262
0263 btf_vmlinux_bin_o=""
0264 if is_enabled CONFIG_DEBUG_INFO_BTF; then
0265 btf_vmlinux_bin_o=.btf.vmlinux.bin.o
0266 if ! gen_btf .tmp_vmlinux.btf $btf_vmlinux_bin_o ; then
0267 echo >&2 "Failed to generate BTF for vmlinux"
0268 echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF"
0269 exit 1
0270 fi
0271 fi
0272
0273 kallsymso=""
0274 kallsymso_prev=""
0275 kallsyms_vmlinux=""
0276 if is_enabled CONFIG_KALLSYMS; then
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301 kallsyms_step 1
0302 kallsyms_step 2
0303
0304
0305 size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso_prev})
0306 size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso})
0307
0308 if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
0309 kallsyms_step 3
0310 fi
0311 fi
0312
0313 vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o}
0314
0315
0316 if is_enabled CONFIG_DEBUG_INFO_BTF && is_enabled CONFIG_BPF; then
0317 info BTFIDS vmlinux
0318 ${RESOLVE_BTFIDS} vmlinux
0319 fi
0320
0321 info SYSMAP System.map
0322 mksysmap vmlinux System.map
0323
0324 if is_enabled CONFIG_BUILDTIME_TABLE_SORT; then
0325 info SORTTAB vmlinux
0326 if ! sorttable vmlinux; then
0327 echo >&2 Failed to sort kernel tables
0328 exit 1
0329 fi
0330 fi
0331
0332
0333 if is_enabled CONFIG_KALLSYMS; then
0334 mksysmap ${kallsyms_vmlinux} .tmp_System.map
0335
0336 if ! cmp -s System.map .tmp_System.map; then
0337 echo >&2 Inconsistent kallsyms data
0338 echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
0339 exit 1
0340 fi
0341 fi
0342
0343
0344 echo "vmlinux: $0" > .vmlinux.d