#!/bin/sh # SPDX-License-Identifier: GPL-2.0 # # link vmlinux # # vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_OBJS) and # $(KBUILD_VMLINUX_LIBS). Most are built-in.a files from top-level directories # in the kernel tree, others are specified in arch/$(ARCH)/Makefile. # $(KBUILD_VMLINUX_LIBS) are archives which are linked conditionally # (not within --whole-archive), and do not require symbol indexes added. # # vmlinux # ^ # | # +--< $(KBUILD_VMLINUX_OBJS) # | +--< init/built-in.a drivers/built-in.a mm/built-in.a + more # | # +--< $(KBUILD_VMLINUX_LIBS) # | +--< lib/lib.a + more # | # +-< ${kallsymso} (see description in KALLSYMS section) # # vmlinux version (uname -v) cannot be updated during normal # descending-into-subdirs phase since we do not yet know if we need to # update vmlinux. # Therefore this step is delayed until just before final link of vmlinux. # # System.map is generated to document addresses of all kernel symbols # Error out on error set -e LD="$1" KBUILD_LDFLAGS="$2" LDFLAGS_vmlinux="$3" # Nice output in kbuild format # Will be supressed by "make -s" info() { printf " %-7s %s\n" "${1}" "${2}" } # Generate a linker script to ensure correct ordering of initcalls. gen_initcalls() { info GEN .tmp_initcalls.lds ${PYTHON} ${srctree}/scripts/jobserver-exec \ ${PERL} ${srctree}/scripts/generate_initcall_order.pl \ ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS} \ > .tmp_initcalls.lds } # If CONFIG_LTO_CLANG is selected, collect generated symbol versions into # .tmp_symversions.lds gen_symversions() { info GEN .tmp_symversions.lds rm -f .tmp_symversions.lds for o in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do if [ -f ${o}.symversions ]; then cat ${o}.symversions >> .tmp_symversions.lds fi done } # Link of vmlinux.o used for section mismatch analysis # ${1} output file modpost_link() { local objects local lds="" objects="--whole-archive \ ${KBUILD_VMLINUX_OBJS} \ --no-whole-archive \ --start-group \ ${KBUILD_VMLINUX_LIBS} \ --end-group" if [ -n "${CONFIG_LTO_CLANG}" ]; then gen_initcalls lds="-T .tmp_initcalls.lds" if [ -n "${CONFIG_MODVERSIONS}" ]; then gen_symversions lds="${lds} -T .tmp_symversions.lds" fi # This might take a while, so indicate that we're doing # an LTO link info LTO ${1} else info LD ${1} fi ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${lds} ${objects} } objtool_link() { local objtoolcmd; local objtoolopt; if [ "${CONFIG_LTO_CLANG} ${CONFIG_STACK_VALIDATION}" = "y y" ]; then # Don't perform vmlinux validation unless explicitly requested, # but run objtool on vmlinux.o now that we have an object file. if [ -n "${CONFIG_UNWINDER_ORC}" ]; then objtoolcmd="orc generate" fi objtoolopt="${objtoolopt} --duplicate" if [ -n "${CONFIG_FTRACE_MCOUNT_USE_OBJTOOL}" ]; then objtoolopt="${objtoolopt} --mcount" fi fi if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then objtoolopt="${objtoolopt} --noinstr" if is_enabled CONFIG_CPU_UNRET_ENTRY; then objtoolopt="${objtoolopt} --unret" fi fi if [ -n "${objtoolopt}" ]; then if [ -z "${objtoolcmd}" ]; then objtoolcmd="check" fi objtoolopt="${objtoolopt} --vmlinux" if [ -z "${CONFIG_FRAME_POINTER}" ]; then objtoolopt="${objtoolopt} --no-fp" fi if [ -n "${CONFIG_GCOV_KERNEL}" ] || [ -n "${CONFIG_LTO_CLANG}" ]; then objtoolopt="${objtoolopt} --no-unreachable" fi if [ -n "${CONFIG_RETPOLINE}" ]; then objtoolopt="${objtoolopt} --retpoline" fi if [ -n "${CONFIG_X86_SMAP}" ]; then objtoolopt="${objtoolopt} --uaccess" fi if [ -n "${CONFIG_SLS}" ]; then objtoolopt="${objtoolopt} --sls" fi info OBJTOOL ${1} tools/objtool/objtool ${objtoolcmd} ${objtoolopt} ${1} fi } # Link of vmlinux # ${1} - output file # ${2}, ${3}, ... - optional extra .o files vmlinux_link() { local output=${1} local objs local libs local ld local ldflags local ldlibs info LD ${output} # skip output file argument shift if [ -n "${CONFIG_LTO_CLANG}" ]; then # Use vmlinux.o instead of performing the slow LTO link again. objs=vmlinux.o libs= else objs="${KBUILD_VMLINUX_OBJS}" libs="${KBUILD_VMLINUX_LIBS}" fi if [ "${SRCARCH}" = "um" ]; then wl=-Wl, ld="${CC}" ldflags="${CFLAGS_vmlinux}" ldlibs="-lutil -lrt -lpthread" else wl= ld="${LD}" ldflags="${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux}" ldlibs= fi ldflags="${ldflags} ${wl}--script=${objtree}/${KBUILD_LDS}" # The kallsyms linking does not need debug symbols included. if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then ldflags="${ldflags} ${wl}--strip-debug" fi if [ -n "${CONFIG_VMLINUX_MAP}" ]; then ldflags="${ldflags} ${wl}-Map=${output}.map" fi ${ld} ${ldflags} -o ${output} \ ${wl}--whole-archive ${objs} ${wl}--no-whole-archive \ ${wl}--start-group ${libs} ${wl}--end-group \ $@ ${ldlibs} } # generate .BTF typeinfo from DWARF debuginfo # ${1} - vmlinux image # ${2} - file to dump raw BTF data into gen_btf() { local pahole_ver if ! [ -x "$(command -v ${PAHOLE})" ]; then echo >&2 "BTF: ${1}: pahole (${PAHOLE}) is not available" return 1 fi pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/') if [ "${pahole_ver}" -lt "116" ]; then echo >&2 "BTF: ${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.16" return 1 fi vmlinux_link ${1} info "BTF" ${2} LLVM_OBJCOPY="${OBJCOPY}" ${PAHOLE} -J ${PAHOLE_FLAGS} ${1} # Create ${2} which contains just .BTF section but no symbols. Add # SHF_ALLOC because .BTF will be part of the vmlinux image. --strip-all # deletes all symbols including __start_BTF and __stop_BTF, which will # be redefined in the linker script. Add 2>/dev/null to suppress GNU # objcopy warnings: "empty loadable segment detected at ..." ${OBJCOPY} --only-section=.BTF --set-section-flags .BTF=alloc,readonly \ --strip-all ${1} ${2} 2>/dev/null # Change e_type to ET_REL so that it can be used to link final vmlinux. # GNU ld 2.35+ and lld do not allow an ET_EXEC input. if [ -n "${CONFIG_CPU_BIG_ENDIAN}" ]; then et_rel='\0\1' else et_rel='\1\0' fi printf "${et_rel}" | dd of=${2} conv=notrunc bs=1 seek=16 status=none } # Create ${2} .S file with all symbols from the ${1} object file kallsyms() { local kallsymopt; if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then kallsymopt="${kallsymopt} --all-symbols" fi if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then kallsymopt="${kallsymopt} --absolute-percpu" fi if [ -n "${CONFIG_KALLSYMS_BASE_RELATIVE}" ]; then kallsymopt="${kallsymopt} --base-relative" fi info KSYMS ${2} ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2} } # Perform one step in kallsyms generation, including temporary linking of # vmlinux. kallsyms_step() { kallsymso_prev=${kallsymso} kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1} kallsymso=${kallsyms_vmlinux}.o kallsyms_S=${kallsyms_vmlinux}.S vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o} kallsyms ${kallsyms_vmlinux} ${kallsyms_S} info AS ${kallsymso} ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \ ${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \ -c -o ${kallsymso} ${kallsyms_S} } # Create map file with all symbols from ${1} # See mksymap for additional details mksysmap() { ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2} } sorttable() { ${objtree}/scripts/sorttable ${1} } # Delete output files in case of error cleanup() { rm -f .btf.* rm -f .tmp_System.map rm -f .tmp_initcalls.lds rm -f .tmp_symversions.lds rm -f .tmp_vmlinux* rm -f System.map rm -f vmlinux rm -f vmlinux.map rm -f vmlinux.o rm -f .vmlinux.d } # Use "make V=1" to debug this script case "${KBUILD_VERBOSE}" in *1*) set -x ;; esac if [ "$1" = "clean" ]; then cleanup exit 0 fi # We need access to CONFIG_ symbols . include/config/auto.conf # Update version info GEN .version if [ -r .version ]; then VERSION=$(expr 0$(cat .version) + 1) echo $VERSION > .version else rm -f .version echo 1 > .version fi; # final build of init/ ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 #link vmlinux.o modpost_link vmlinux.o objtool_link vmlinux.o # modpost vmlinux.o to check for section mismatches ${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1 info MODINFO modules.builtin.modinfo ${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo info GEN modules.builtin # The second line aids cases where multiple modules share the same object. tr '\0' '\n' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' | tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin btf_vmlinux_bin_o="" if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then btf_vmlinux_bin_o=.btf.vmlinux.bin.o if ! gen_btf .tmp_vmlinux.btf $btf_vmlinux_bin_o ; then echo >&2 "Failed to generate BTF for vmlinux" echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF" exit 1 fi fi kallsymso="" kallsymso_prev="" kallsyms_vmlinux="" if [ -n "${CONFIG_KALLSYMS}" ]; then # kallsyms support # Generate section listing all symbols and add it into vmlinux # It's a three step process: # 1) Link .tmp_vmlinux1 so it has all symbols and sections, # but __kallsyms is empty. # Running kallsyms on that gives us .tmp_kallsyms1.o with # the right size # 2) Link .tmp_vmlinux2 so it now has a __kallsyms section of # the right size, but due to the added section, some # addresses have shifted. # From here, we generate a correct .tmp_kallsyms2.o # 3) That link may have expanded the kernel image enough that # more linker branch stubs / trampolines had to be added, which # introduces new names, which further expands kallsyms. Do another # pass if that is the case. In theory it's possible this results # in even more stubs, but unlikely. # KALLSYMS_EXTRA_PASS=1 may also used to debug or work around # other bugs. # 4) The correct ${kallsymso} is linked into the final vmlinux. # # a) Verify that the System.map from vmlinux matches the map from # ${kallsymso}. kallsyms_step 1 kallsyms_step 2 # step 3 size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso_prev}) size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso}) if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then kallsyms_step 3 fi fi vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o} # fill in BTF IDs if [ -n "${CONFIG_DEBUG_INFO_BTF}" -a -n "${CONFIG_BPF}" ]; then info BTFIDS vmlinux ${RESOLVE_BTFIDS} vmlinux fi if [ -n "${CONFIG_BUILDTIME_TABLE_SORT}" ]; then info SORTTAB vmlinux if ! sorttable vmlinux; then echo >&2 Failed to sort kernel tables exit 1 fi fi info SYSMAP System.map mksysmap vmlinux System.map # step a (see comment above) if [ -n "${CONFIG_KALLSYMS}" ]; then mksysmap ${kallsyms_vmlinux} .tmp_System.map if ! cmp -s System.map .tmp_System.map; then echo >&2 Inconsistent kallsyms data echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround exit 1 fi fi # For fixdep echo "vmlinux: $0" > .vmlinux.d
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
atomic | Folder | 0755 |
|
|
basic | Folder | 0755 |
|
|
clang-tools | Folder | 0755 |
|
|
coccinelle | Folder | 0755 |
|
|
dtc | Folder | 0755 |
|
|
dummy-tools | Folder | 0755 |
|
|
gcc-plugins | Folder | 0755 |
|
|
gdb | Folder | 0755 |
|
|
genksyms | Folder | 0755 |
|
|
kconfig | Folder | 0755 |
|
|
ksymoops | Folder | 0755 |
|
|
mod | Folder | 0755 |
|
|
package | Folder | 0755 |
|
|
selinux | Folder | 0755 |
|
|
tracing | Folder | 0755 |
|
|
.asn1_compiler.cmd | File | 726 B | 0644 |
|
.bin2c.cmd | File | 421 B | 0644 |
|
.extract-cert.cmd | File | 499 B | 0644 |
|
.insert-sys-cert.cmd | File | 521 B | 0644 |
|
.kallsyms.cmd | File | 451 B | 0644 |
|
.sign-file.cmd | File | 469 B | 0644 |
|
.sorttable.cmd | File | 782 B | 0644 |
|
Kbuild.include | File | 10.15 KB | 0644 |
|
Kconfig.include | File | 2.56 KB | 0644 |
|
Lindent | File | 502 B | 0755 |
|
Makefile | File | 1.64 KB | 0644 |
|
Makefile.asm-generic | File | 1.82 KB | 0644 |
|
Makefile.build | File | 19.66 KB | 0644 |
|
Makefile.clang | File | 1.59 KB | 0644 |
|
Makefile.clean | File | 2.2 KB | 0644 |
|
Makefile.compiler | File | 2.54 KB | 0644 |
|
Makefile.dtbinst | File | 1007 B | 0644 |
|
Makefile.extrawarn | File | 2.99 KB | 0644 |
|
Makefile.gcc-plugins | File | 2.71 KB | 0644 |
|
Makefile.headersinst | File | 2.88 KB | 0644 |
|
Makefile.host | File | 4.63 KB | 0644 |
|
Makefile.kasan | File | 1.67 KB | 0644 |
|
Makefile.kcov | File | 333 B | 0644 |
|
Makefile.kcsan | File | 739 B | 0644 |
|
Makefile.lib | File | 18.02 KB | 0644 |
|
Makefile.modfinal | File | 2.73 KB | 0644 |
|
Makefile.modinst | File | 2.51 KB | 0644 |
|
Makefile.modpost | File | 4.37 KB | 0644 |
|
Makefile.package | File | 6.61 KB | 0644 |
|
Makefile.ubsan | File | 770 B | 0644 |
|
Makefile.userprogs | File | 1.57 KB | 0644 |
|
adjust_autoksyms.sh | File | 2.07 KB | 0755 |
|
as-version.sh | File | 2.02 KB | 0755 |
|
asn1_compiler | File | 35.11 KB | 0755 |
|
asn1_compiler.c | File | 35.33 KB | 0644 |
|
bin2c | File | 16.44 KB | 0755 |
|
bin2c.c | File | 743 B | 0644 |
|
bloat-o-meter | File | 3.36 KB | 0755 |
|
bootgraph.pl | File | 5.64 KB | 0755 |
|
bpf_doc.py | File | 24.98 KB | 0755 |
|
cc-can-link.sh | File | 166 B | 0755 |
|
cc-version.sh | File | 1.51 KB | 0755 |
|
check-sysctl-docs | File | 4.37 KB | 0755 |
|
check_extable.sh | File | 4.93 KB | 0755 |
|
checkdeclares.pl | File | 1.1 KB | 0755 |
|
checkincludes.pl | File | 1.94 KB | 0755 |
|
checkkconfigsymbols.py | File | 15.75 KB | 0755 |
|
checkpatch.pl | File | 223.75 KB | 0755 |
|
checkstack.pl | File | 5.86 KB | 0755 |
|
checksyscalls.sh | File | 7.42 KB | 0755 |
|
checkversion.pl | File | 2.16 KB | 0755 |
|
cleanfile | File | 3.46 KB | 0755 |
|
cleanpatch | File | 5.06 KB | 0755 |
|
coccicheck | File | 7.89 KB | 0755 |
|
config | File | 4.67 KB | 0755 |
|
const_structs.checkpatch | File | 1009 B | 0644 |
|
decode_stacktrace.sh | File | 7.51 KB | 0755 |
|
decodecode | File | 2.88 KB | 0755 |
|
depmod.sh | File | 1.41 KB | 0755 |
|
dev-needs.sh | File | 6.07 KB | 0755 |
|
diffconfig | File | 4.12 KB | 0755 |
|
documentation-file-ref-check | File | 5.55 KB | 0755 |
|
export_report.pl | File | 4.5 KB | 0755 |
|
extract-cert | File | 17.89 KB | 0755 |
|
extract-cert.c | File | 3.63 KB | 0644 |
|
extract-ikconfig | File | 1.69 KB | 0755 |
|
extract-module-sig.pl | File | 3.66 KB | 0755 |
|
extract-sys-certs.pl | File | 3.75 KB | 0755 |
|
extract-vmlinux | File | 1.66 KB | 0755 |
|
extract_xc3028.pl | File | 44.62 KB | 0755 |
|
faddr2line | File | 8.17 KB | 0755 |
|
file-size.sh | File | 86 B | 0755 |
|
find-unused-docs.sh | File | 1.27 KB | 0755 |
|
gcc-goto.sh | File | 511 B | 0755 |
|
gcc-ld | File | 711 B | 0755 |
|
gcc-x86_32-has-stack-protector.sh | File | 408 B | 0755 |
|
gcc-x86_64-has-stack-protector.sh | File | 198 B | 0755 |
|
gen_autoksyms.sh | File | 1.47 KB | 0755 |
|
gen_ksymdeps.sh | File | 556 B | 0755 |
|
generate_initcall_order.pl | File | 5.95 KB | 0755 |
|
get_abi.pl | File | 15.1 KB | 0755 |
|
get_dvb_firmware | File | 24.54 KB | 0755 |
|
get_feat.pl | File | 14.34 KB | 0755 |
|
get_maintainer.pl | File | 67.13 KB | 0755 |
|
gfp-translate | File | 1.69 KB | 0755 |
|
headerdep.pl | File | 3.5 KB | 0755 |
|
headers_check.pl | File | 3.73 KB | 0755 |
|
headers_install.sh | File | 3.35 KB | 0755 |
|
insert-sys-cert | File | 22.21 KB | 0755 |
|
insert-sys-cert.c | File | 13.08 KB | 0644 |
|
jobserver-exec | File | 2.16 KB | 0755 |
|
kallsyms | File | 22.47 KB | 0755 |
|
kallsyms.c | File | 18.06 KB | 0644 |
|
kernel-doc | File | 68.74 KB | 0755 |
|
ld-version.sh | File | 1.82 KB | 0755 |
|
leaking_addresses.pl | File | 12.8 KB | 0755 |
|
link-vmlinux.sh | File | 10.92 KB | 0755 |
|
makelst | File | 808 B | 0755 |
|
markup_oops.pl | File | 7.92 KB | 0755 |
|
min-tool-version.sh | File | 558 B | 0755 |
|
mkcompile_h | File | 2.48 KB | 0755 |
|
mksysmap | File | 1.34 KB | 0755 |
|
mkuboot.sh | File | 414 B | 0755 |
|
module.lds | File | 597 B | 0644 |
|
module.lds.S | File | 1.65 KB | 0644 |
|
modules-check.sh | File | 427 B | 0755 |
|
nsdeps | File | 1.72 KB | 0644 |
|
objdiff | File | 2.84 KB | 0755 |
|
pahole-flags.sh | File | 749 B | 0755 |
|
pahole-version.sh | File | 269 B | 0755 |
|
parse-maintainers.pl | File | 4.54 KB | 0755 |
|
patch-kernel | File | 9.95 KB | 0755 |
|
profile2linkerlist.pl | File | 414 B | 0755 |
|
prune-kernel | File | 708 B | 0755 |
|
recordmcount.c | File | 16.75 KB | 0644 |
|
recordmcount.h | File | 19.37 KB | 0644 |
|
recordmcount.pl | File | 17.63 KB | 0755 |
|
remove-stale-files | File | 1.3 KB | 0755 |
|
setlocalversion | File | 3.5 KB | 0755 |
|
show_delta | File | 3.01 KB | 0755 |
|
sign-file | File | 26.52 KB | 0755 |
|
sign-file.c | File | 9.93 KB | 0644 |
|
sorttable | File | 21.51 KB | 0755 |
|
sorttable.c | File | 8.74 KB | 0644 |
|
sorttable.h | File | 9.65 KB | 0644 |
|
spdxcheck-test.sh | File | 277 B | 0644 |
|
spdxcheck.py | File | 10.09 KB | 0755 |
|
spelling.txt | File | 31.88 KB | 0644 |
|
sphinx-pre-install | File | 24.45 KB | 0755 |
|
split-man.pl | File | 604 B | 0755 |
|
stackdelta | File | 1.84 KB | 0755 |
|
stackusage | File | 794 B | 0755 |
|
subarch.include | File | 619 B | 0644 |
|
syscallhdr.sh | File | 1.89 KB | 0755 |
|
syscallnr.sh | File | 1.45 KB | 0755 |
|
syscalltbl.sh | File | 1.45 KB | 0755 |
|
tags.sh | File | 9.87 KB | 0755 |
|
tools-support-relr.sh | File | 546 B | 0755 |
|
ubuntu-retpoline-extract-one | File | 7.26 KB | 0644 |
|
unifdef.c | File | 34.8 KB | 0644 |
|
ver_linux | File | 2.59 KB | 0755 |
|
xen-hypercalls.sh | File | 386 B | 0755 |
|
xz_wrap.sh | File | 563 B | 0755 |
|