• Josh Poimboeuf's avatar
    vmlinux.lds.h: Discard .note.gnu.property section · f7ba52f3
    Josh Poimboeuf authored
    When tooling reads ELF notes, it assumes each note entry is aligned to
    the value listed in the .note section header's sh_addralign field.
    
    The kernel-created ELF notes in the .note.Linux and .note.Xen sections
    are aligned to 4 bytes.  This causes the toolchain to set those
    sections' sh_addralign values to 4.
    
    On the other hand, the GCC-created .note.gnu.property section has an
    sh_addralign value of 8 for some reason, despite being based on struct
    Elf32_Nhdr which only needs 4-byte alignment.
    
    When the mismatched input sections get linked together into the vmlinux
    .notes output section, the higher alignment "wins", resulting in an
    sh_addralign of 8, which confuses tooling.  For example:
    
      $ readelf -n .tmp_vmlinux.btf
      ...
      readelf: .tmp_vmlinux.btf: Warning: note with invalid namesz and/or descsz found at offset 0x170
      readelf: .tmp_vmlinux.btf: Warning:  type: 0x4, namesize: 0x006e6558, descsize: 0x00008801, alignment: 8
    
    In this case readelf thinks there's alignment padding where there is
    none, so it starts reading an ELF note in the middle.
    
    With newer toolchains (e.g., latest Fedora Rawhide), a similar mismatch
    triggers a build failure when combined with CONFIG_X86_KERNEL_IBT:
    
      btf_encoder__encode: btf__dedup failed!
      Failed to encode BTF
      libbpf: failed to find '.BTF' ELF section in vmlinux
      FAILED: load BTF from vmlinux: No data available
      make[1]: *** [scripts/Makefile.vmlinux:35: vmlinux] Error 255
    
    This latter error was caused by pahole crashing when it encountered the
    corrupt .notes section.  This crash has been fixed in dwarves version
    1.25.  As Tianyi Liu describes:
    
      "Pahole reads .notes to look for LINUX_ELFNOTE_BUILD_LTO. When LTO is
       enabled, pahole needs to call cus__merge_and_process_cu to merge
       compile units, at which point there should only be one unspecified
       type (used to represent some compilation information) in the global
       context.
    
       However, when the kernel is compiled without LTO, if pahole calls
       cus__merge_and_process_cu due to alignment issues with notes,
       multiple unspecified types may appear after merging the cus, and
       older versions of pahole only support up to one. This is why pahole
       1.24 crashes, while newer versions support multiple. However, the
       latest version of pahole still does not solve the problem of
       incorrect LTO recognition, so compiling the kernel may be slower
       than normal."
    
    Even with the newer pahole, the note section misaligment issue still
    exists and pahole is misinterpreting the LTO note.  Fix it by discarding
    the .note.gnu.property section.  While GNU properties are important for
    user space (and VDSO), they don't seem to have any use for vmlinux.
    
    (In fact, they're already getting (inadvertently) stripped from vmlinux
    when CONFIG_DEBUG_INFO_BTF is enabled.  The BTF data is extracted from
    vmlinux.o with "objcopy --only-section=.BTF" into .btf.vmlinux.bin.o.
    That file doesn't have .note.gnu.property, so when it gets modified and
    linked back into the main object, the linker automatically strips it
    (see "How GNU properties are merged" in the ld man page).)
    Reported-by: default avatarDaniel Xu <dxu@dxuuu.xyz>
    Link: https://lkml.kernel.org/bpf/57830c30-cd77-40cf-9cd1-3bb608aa602e@app.fastmail.comDebugged-by: default avatarTianyi Liu <i.pear@outlook.com>
    Suggested-by: default avatarJoan Bruguera Micó <joanbrugueram@gmail.com>
    Link: https://lore.kernel.org/r/20230418214925.ay3jpf2zhw75kgmd@trebleSigned-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
    f7ba52f3
vmlinux.lds.h 32.6 KB