diff options
Diffstat (limited to 'scripts/link-vmlinux.sh')
| -rwxr-xr-x | scripts/link-vmlinux.sh | 94 | 
1 files changed, 59 insertions, 35 deletions
| diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index a7124f895b24..06495379fcd8 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -56,13 +56,19 @@ modpost_link()  }  # Link of vmlinux -# ${1} - optional extra .o files -# ${2} - output file +# ${1} - output file +# ${2}, ${3}, ... - optional extra .o files  vmlinux_link()  {  	local lds="${objtree}/${KBUILD_LDS}" +	local output=${1}  	local objects +	info LD ${output} + +	# skip output file argument +	shift +  	if [ "${SRCARCH}" != "um" ]; then  		objects="--whole-archive			\  			${KBUILD_VMLINUX_OBJS}			\ @@ -70,9 +76,10 @@ vmlinux_link()  			--start-group				\  			${KBUILD_VMLINUX_LIBS}			\  			--end-group				\ -			${1}" +			${@}" -		${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}	\ +		${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux}	\ +			-o ${output}				\  			-T ${lds} ${objects}  	else  		objects="-Wl,--whole-archive			\ @@ -81,9 +88,10 @@ vmlinux_link()  			-Wl,--start-group			\  			${KBUILD_VMLINUX_LIBS}			\  			-Wl,--end-group				\ -			${1}" +			${@}" -		${CC} ${CFLAGS_vmlinux} -o ${2}			\ +		${CC} ${CFLAGS_vmlinux}				\ +			-o ${output}				\  			-Wl,-T,${lds}				\  			${objects}				\  			-lutil -lrt -lpthread @@ -92,23 +100,36 @@ vmlinux_link()  }  # generate .BTF typeinfo from DWARF debuginfo +# ${1} - vmlinux image +# ${2} - file to dump raw BTF data into  gen_btf()  { -	local pahole_ver; +	local pahole_ver +	local bin_arch  	if ! [ -x "$(command -v ${PAHOLE})" ]; then  		info "BTF" "${1}: pahole (${PAHOLE}) is not available" -		return 0 +		return 1  	fi  	pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/')  	if [ "${pahole_ver}" -lt "113" ]; then  		info "BTF" "${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.13" -		return 0 +		return 1  	fi -	info "BTF" ${1} +	info "BTF" ${2} +	vmlinux_link ${1}  	LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1} + +	# dump .BTF section into raw binary file to link with final vmlinux +	bin_arch=$(LANG=C ${OBJDUMP} -f ${1} | grep architecture | \ +		cut -d, -f1 | cut -d' ' -f2) +	bin_format=$(LANG=C ${OBJDUMP} -f ${1} | grep 'file format' | \ +		awk '{print $4}') +	${OBJCOPY} --dump-section .BTF=.btf.vmlinux.bin ${1} 2>/dev/null +	${OBJCOPY} -I binary -O ${bin_format} -B ${bin_arch} \ +		--rename-section .data=.BTF .btf.vmlinux.bin ${2}  }  # Create ${2} .o file with all symbols from the ${1} object file @@ -138,6 +159,18 @@ kallsyms()  	${CC} ${aflags} -c -o ${2} ${afile}  } +# Perform one step in kallsyms generation, including temporary linking of +# vmlinux. +kallsyms_step() +{ +	kallsymso_prev=${kallsymso} +	kallsymso=.tmp_kallsyms${1}.o +	kallsyms_vmlinux=.tmp_vmlinux${1} + +	vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o} +	kallsyms ${kallsyms_vmlinux} ${kallsymso} +} +  # Create map file with all symbols from ${1}  # See mksymap for additional details  mksysmap() @@ -153,6 +186,7 @@ sortextable()  # Delete output files in case of error  cleanup()  { +	rm -f .btf.*  	rm -f .tmp_System.map  	rm -f .tmp_kallsyms*  	rm -f .tmp_vmlinux* @@ -210,12 +244,20 @@ info LD vmlinux.o  modpost_link vmlinux.o  # modpost vmlinux.o to check for section mismatches -${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o +${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1  info MODINFO modules.builtin.modinfo  ${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 +	fi +fi +  kallsymso="" +kallsymso_prev=""  kallsyms_vmlinux=""  if [ -n "${CONFIG_KALLSYMS}" ]; then @@ -242,37 +284,19 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then  	# a)  Verify that the System.map from vmlinux matches the map from  	#     ${kallsymso}. -	kallsymso=.tmp_kallsyms2.o -	kallsyms_vmlinux=.tmp_vmlinux2 - -	# step 1 -	vmlinux_link "" .tmp_vmlinux1 -	kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o - -	# step 2 -	vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2 -	kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o +	kallsyms_step 1 +	kallsyms_step 2  	# step 3 -	size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" .tmp_kallsyms1.o) -	size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" .tmp_kallsyms2.o) +	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 -		kallsymso=.tmp_kallsyms3.o -		kallsyms_vmlinux=.tmp_vmlinux3 - -		vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3 - -		kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o +		kallsyms_step 3  	fi  fi -info LD vmlinux -vmlinux_link "${kallsymso}" vmlinux - -if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then -	gen_btf vmlinux -fi +vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o}  if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then  	info SORTEX vmlinux | 
