On Mon, Nov 21, 2022 at 4:00 PM Bill Wendling <morbo@xxxxxxxxxx> wrote: > > This patch is an attempted fix for the issue discussed in [1]. I believe it's > actually caused by pahole generating a corrupted ELF file. > > LLD generates a zero-sized .BTF section, while BFD doesn't. When pahole goes to > add the .BTF data to an LLD-generated file, the section exists, but is too > small. The ELF calls don't appear to adjust following sections' addresses in > this case. > > To avoid this, the patch does some magic with objcopy to generate a separate > .BTF section and perform some renaming. > > NOTE: This patch resembles a hack. If it's possible to adjust a section's size > with ELF calls we should do it that way. > For instance, this could be done in the kernel like the following. I don't know which is the more acceptable alternative. diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index b808ef0..e6bfe51 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -212,6 +212,24 @@ info "BTF" ${2} vmlinux_link ${1} + if ${LD_vmlinux} --version | grep -q LLD ; then + # LLD will generate a zero-sized .BTF section (the BFD linker + # doesn't). In that case, pahole tries to use the zero-sized + # section to house the BTF information. However, pahole doesn't + # adjust the addresses of sections around the .BTF section, + # resulting in an ELF file that appears invalid to further + # linkers. Avoid this issue by renaming the .BTF to .BTF_old + # and letting pahole add a new .BTF section. + # TODO(b/182271653): If/when pahole is fixed, we should remove + # this code. + BTF_SECTION=$(${READELF} -SW ${1} | grep -v .BTF_ids | grep .BTF) + if [[ -n "${BTF_SECTION}" ]]; then + BTF_SIZE=$(echo ${BTF_SECTION} | awk '{print $6}') + if [[ "0x${BTF_SIZE}" -eq 0 ]]; then + ${OBJCOPY} --rename-section .BTF=.BTF.old ${1} + fi + fi + fi LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1} # Create ${2} which contains just .BTF section but no symbols. Add > [1]: https://lore.kernel.org/dwarves/20210317232657.mdnsuoqx6nbddjgt@xxxxxxxxxx/ > > Bill Wendling (1): > btf_encoder: Generate a new .BTF section even if one exists > > btf_encoder.c | 88 +++++++++++++++++++++++++++++++-------------------- > 1 file changed, 54 insertions(+), 34 deletions(-) > > -- > 2.38.1.584.g0f3c55d4c2-goog >