]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
kbuild: Remove debug info from kallsyms linking
authorKees Cook <keescook@chromium.org>
Wed, 4 Mar 2020 02:18:34 +0000 (18:18 -0800)
committerMarcelo Henrique Cerri <marcelo.cerri@canonical.com>
Mon, 22 Jun 2020 20:22:44 +0000 (17:22 -0300)
BugLink: https://bugs.launchpad.net/bugs/1881178
[ Upstream commit af73d78bd384aa9b8789aa6e7ddbb165f971276f ]

When CONFIG_DEBUG_INFO is enabled, the two kallsyms linking steps spend
time collecting and writing the dwarf sections to the temporary output
files. kallsyms does not need this information, and leaving it off
halves their linking time. This is especially noticeable without
CONFIG_DEBUG_INFO_REDUCED. The BTF linking stage, however, does still
need those details.

Refactor the BTF and kallsyms generation stages slightly for more
regularized temporary names. Skip debug during kallsyms links.
Additionally move "info BTF" to the correct place since commit
8959e39272d6 ("kbuild: Parameterize kallsyms generation and correct
reporting"), which added "info LD ..." to vmlinux_link calls.

For a full debug info build with BTF, my link time goes from 1m06s to
0m54s, saving about 12 seconds, or 18%.

Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/202003031814.4AEA3351@keescook
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
scripts/link-vmlinux.sh

index 408b5c0b99b1b88c8048fbc6103429a8c7689856..aa1386079f0c1c459d9898087cadd0a4b17b18f8 100755 (executable)
@@ -63,12 +63,18 @@ vmlinux_link()
        local lds="${objtree}/${KBUILD_LDS}"
        local output=${1}
        local objects
+       local strip_debug
 
        info LD ${output}
 
        # skip output file argument
        shift
 
+       # The kallsyms linking does not need debug symbols included.
+       if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then
+               strip_debug=-Wl,--strip-debug
+       fi
+
        if [ "${SRCARCH}" != "um" ]; then
                objects="--whole-archive                        \
                        ${KBUILD_VMLINUX_OBJS}                  \
@@ -79,6 +85,7 @@ vmlinux_link()
                        ${@}"
 
                ${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux}      \
+                       ${strip_debug#-Wl,}                     \
                        -o ${output}                            \
                        -T ${lds} ${objects}
        else
@@ -91,6 +98,7 @@ vmlinux_link()
                        ${@}"
 
                ${CC} ${CFLAGS_vmlinux}                         \
+                       ${strip_debug}                          \
                        -o ${output}                            \
                        -Wl,-T,${lds}                           \
                        ${objects}                              \
@@ -106,6 +114,8 @@ gen_btf()
 {
        local pahole_ver
        local bin_arch
+       local bin_format
+       local bin_file
 
        if ! [ -x "$(command -v ${PAHOLE})" ]; then
                echo >&2 "BTF: ${1}: pahole (${PAHOLE}) is not available"
@@ -118,8 +128,9 @@ gen_btf()
                return 1
        fi
 
-       info "BTF" ${2}
        vmlinux_link ${1}
+
+       info "BTF" ${2}
        LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
 
        # dump .BTF section into raw binary file to link with final vmlinux
@@ -127,11 +138,12 @@ gen_btf()
                cut -d, -f1 | cut -d' ' -f2)
        bin_format=$(LANG=C ${OBJDUMP} -f ${1} | grep 'file format' | \
                awk '{print $4}')
+       bin_file=.btf.vmlinux.bin
        ${OBJCOPY} --change-section-address .BTF=0 \
                --set-section-flags .BTF=alloc -O binary \
-               --only-section=.BTF ${1} .btf.vmlinux.bin
+               --only-section=.BTF ${1} $bin_file
        ${OBJCOPY} -I binary -O ${bin_format} -B ${bin_arch} \
-               --rename-section .data=.BTF .btf.vmlinux.bin ${2}
+               --rename-section .data=.BTF $bin_file ${2}
 }
 
 # Create ${2} .o file with all symbols from the ${1} object file
@@ -166,8 +178,8 @@ kallsyms()
 kallsyms_step()
 {
        kallsymso_prev=${kallsymso}
-       kallsymso=.tmp_kallsyms${1}.o
-       kallsyms_vmlinux=.tmp_vmlinux${1}
+       kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1}
+       kallsymso=${kallsyms_vmlinux}.o
 
        vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o}
        kallsyms ${kallsyms_vmlinux} ${kallsymso}
@@ -190,7 +202,6 @@ cleanup()
 {
        rm -f .btf.*
        rm -f .tmp_System.map
-       rm -f .tmp_kallsyms*
        rm -f .tmp_vmlinux*
        rm -f System.map
        rm -f vmlinux
@@ -253,9 +264,8 @@ ${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo
 
 btf_vmlinux_bin_o=""
 if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then
-       if gen_btf .tmp_vmlinux.btf .btf.vmlinux.bin.o ; then
-               btf_vmlinux_bin_o=.btf.vmlinux.bin.o
-       else
+       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