若鸟的博客

记一次BTF开启kernel编译报错

Published at 2025-01-22 | Last Update 2025-01-22

现象

最近在编译内核时开启CONFIG_DEBUG_INFO_BTF=y后报错

  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o - due to: include/generated/compile.h
  AR      init/built-in.a - due to: init/version.o
  LD      vmlinux.o
  MODPOST vmlinux.symvers - due to: vmlinux.o
  MODINFO modules.builtin.modinfo
  GEN     modules.builtin
  LD      .tmp_vmlinux.btf
  BTF     .btf.vmlinux.bin.o
  LD      .tmp_vmlinux.kallsyms1
  KSYMS   .tmp_vmlinux.kallsyms1.S
  AS      .tmp_vmlinux.kallsyms1.S
  LD      .tmp_vmlinux.kallsyms2
  KSYMS   .tmp_vmlinux.kallsyms2.S
  AS      .tmp_vmlinux.kallsyms2.S
  LD      vmlinux
  BTFIDS  vmlinux
FAILED: load BTF from vmlinux: Unknown error -22make: *** [Makefile:1179: vmlinux] Error 255

FAILED: load BTF from vmlinux: Unknown error

报错位置:

tools/bpf/resolve_btfids/main.c

static int symbols_resolve(struct object *obj)
{
        int nr_typedefs = obj->nr_typedefs;
        int nr_structs  = obj->nr_structs;
        int nr_unions   = obj->nr_unions;
        int nr_funcs    = obj->nr_funcs;
        int err, type_id;
        struct btf *btf;
        __u32 nr;

        btf = btf__parse(obj->btf ?: obj->path, NULL);
        err = libbpf_get_error(btf);
        if (err) {
                pr_err("FAILED: load BTF from %s: %s",
                        obj->path, strerror(err));
                return -1;
        }

     	.....
}

解决:

把dwarves==1.25降低为1.21版本

wget https://fedorapeople.org/~acme/dwarves/dwarves-1.21.tar.xz
tar -xvf dwarves-1.21.tar.xz
cd dwarves-1.21
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/lib/
make
make install
export LD_LIBRARY_PATH=/usr/local/lib
回到内核编译内核
make -j(nproc) V=2

原因

DWARF是嵌入在 ELF 文件(Linux 上的可执行文件格式)的特定段中供调试程序(比如GDB)进行调试的数据,包括:

  • 源代码与机器码的映射:哪一行代码对应哪段汇编指令。

  • 变量和函数信息:变量的名称、类型、内存位置,函数的调用关系。

  • 调用栈:程序运行时的函数调用层次。

BTF 是为了让 BPF 程序能够在内核更新后仍然正确访问数据,而无需重新编译,所生成的记录内核数据结构的地址和偏移记录的数据

dwarves工具库会生成pahole工具来处理DWARF调试信息,将其转换为BTF,在编译内核时开启了CONFIG_DEBUG_INFO_BTF=y后会把内核的数据结构通过pahole工具抽取DWARF组成BTF段存储在vmlinux中

llvm-objdump -h vmlinux

vmlinux:	file format elf64-x86-64

Sections:
Idx Name                       Size     VMA              LMA              Type
  0                            00000000 0000000000000000 000000000416f000 
  1 .text                      016037d7 ffffffff81000000 0000000001000000 TEXT
  2 .rela.text                 013753c8 0000000000000000 000000000416f000 
  3 .rodata                    006157b0 ffffffff82800000 0000000002800000 DATA
  4 .rela.rodata               000f19f8 0000000000000000 000000000416f000 
  5 .pci_fixup                 00003180 ffffffff82e157b0 0000000002e157b0 DATA
  6 .rela.pci_fixup            00004a40 0000000000000000 000000000416f000 
  7 .tracedata                 00000078 ffffffff82e18930 0000000002e18930 DATA
  8 .rela.tracedata            00000120 0000000000000000 000000000416f000 
  9 __ksymtab                  00012174 ffffffff82e189a8 0000000002e189a8 DATA
 10 .rela__ksymtab             0006c2b8 0000000000000000 000000000416f000 
 11 __ksymtab_gpl              0000ef4c ffffffff82e2ab1c 0000000002e2ab1c DATA
 12 .rela__ksymtab_gpl         00059b68 0000000000000000 000000000416f000 
 13 __ksymtab_strings          00035fa3 ffffffff82e39a68 0000000002e39a68 DATA
 14 __param                    00004a88 ffffffff82e6fa10 0000000002e6fa10 DATA
 15 .rela__param               00008538 0000000000000000 000000000416f000 
 16 __modver                   00000060 ffffffff82e74498 0000000002e74498 DATA
 17 .rela__modver              00000120 0000000000000000 000000000416f000 
 18 __ex_table                 00003408 ffffffff82e74500 0000000002e74500 DATA
 19 .rela__ex_table            00013830 0000000000000000 000000000416f000 
 20 .notes                     0000003c ffffffff82e77908 0000000002e77908 
 ...
 
 21 .BTF                       00393196 ffffffff82e77944 0000000002e77944 DATA
 22 .BTF_ids                   0000003c ffffffff8320aadc 000000000320aadc DATA
 23 .data                      00707280 ffffffff83400000 0000000003400000 DATA
 24 .rela.data                 0064fce0 0000000000000000 000000000416f000 
 25 __bug_table                0001a160 ffffffff83b07280 0000000003b07280 DATA
 ...
 76 .shstrtab                  0000029b 0000000000000000 000000000416f000

在没有开启BTF时,section中则不会有BTF

llvm-objdump -h vmlinux

vmlinux:	file format elf64-x86-64

Sections:
Idx Name                       Size     VMA              LMA              Type
  0                            00000000 0000000000000000 0000000003d6f000 
  1 .text                      016037d7 ffffffff81000000 0000000001000000 TEXT
  2 .rela.text                 01375398 0000000000000000 0000000003d6f000 
  3 .rodata                    00615770 ffffffff82800000 0000000002800000 DATA
  4 .rela.rodata               000f19c8 0000000000000000 0000000003d6f000 
  5 .pci_fixup                 00003180 ffffffff82e15770 0000000002e15770 DATA
  6 .rela.pci_fixup            00004a40 0000000000000000 0000000003d6f000 
  7 .tracedata                 00000078 ffffffff82e188f0 0000000002e188f0 DATA
  8 .rela.tracedata            00000120 0000000000000000 0000000003d6f000 
  9 __ksymtab                  00012174 ffffffff82e18968 0000000002e18968 DATA
 10 .rela__ksymtab             0006c2b8 0000000000000000 0000000003d6f000 
 11 __ksymtab_gpl              0000ef4c ffffffff82e2aadc 0000000002e2aadc DATA
 12 .rela__ksymtab_gpl         00059b68 0000000000000000 0000000003d6f000 
 13 __ksymtab_strings          00035fa3 ffffffff82e39a28 0000000002e39a28 DATA
 14 __param                    00004a88 ffffffff82e6f9d0 0000000002e6f9d0 DATA
 15 .rela__param               00008538 0000000000000000 0000000003d6f000 
 16 __modver                   00000060 ffffffff82e74458 0000000002e74458 DATA
 17 .rela__modver              00000120 0000000000000000 0000000003d6f000 
 18 __ex_table                 00003408 ffffffff82e744c0 0000000002e744c0 DATA
 19 .rela__ex_table            00013830 0000000000000000 0000000003d6f000 
 20 .notes                     0000003c ffffffff82e778c8 0000000002e778c8 
 21 .data                      00707300 ffffffff83000000 0000000003000000 DATA
 22 .rela.data                 0064fdb8 0000000000000000 0000000003d6f000 
 23 __bug_table                0001a160 ffffffff83707300 0000000003707300 DATA
 24 .rela__bug_table           00068580 0000000000000000 0000000003d6f000 
 25 .orc_unwind_ip             00261934 ffffffff83721460 0000000003721460 DATA
 26 .rela.orc_unwind_ip        00e49738 0000000000000000 0000000003d6f000 
 27 .orc_unwind                003925ce ffffffff83982d94 0000000003982d94 DATA
 28 .orc_lookup                000580e4 ffffffff83d15364 0000000003d15364 BSS
 29 .vvar                      00001000 ffffffff83d6e000 0000000003d6e000 DATA
 30 .data..percpu              00032618 0000000000000000 0000000003d6f000 DATA
 31 .rela.data..percpu         00000150 0000000000000000 0000000003d6f000 
 32 .init.text                 00082bca ffffffff83da2000 0000000003da2000 TEXT
 33 .rela.init.text            000e4eb8 0000000000000000 0000000003d6f000 
 34 .altinstr_aux              000027f3 ffffffff83e24bca 0000000003e24bca TEXT
 35 .rela.altinstr_aux         00008eb0 0000000000000000 0000000003d6f000 
 36 .init.data                 000a41e8 ffffffff83e28000 0000000003e28000 DATA
 37 .rela.init.data            00036438 0000000000000000 0000000003d6f000 
 38 .x86_cpu_dev.init          00000028 ffffffff83ecc1e8 0000000003ecc1e8 DATA
 39 .rela.x86_cpu_dev.init     00000078 0000000000000000 0000000003d6f000 
 40 .altinstructions           00006320 ffffffff83ecc210 0000000003ecc210 DATA
 41 .rela.altinstructions      00013488 0000000000000000 0000000003d6f000 
 42 .altinstr_replacement      0000172b ffffffff83ed2530 0000000003ed2530 TEXT
 43 .rela.altinstr_replacement 00004890 0000000000000000 0000000003d6f000 
 44 .iommu_table               000000a0 ffffffff83ed3c60 0000000003ed3c60 DATA
 45 .rela.iommu_table          00000120 0000000000000000 0000000003d6f000 
 46 .apicdrivers               00000010 ffffffff83ed3d00 0000000003ed3d00 DATA
 47 .rela.apicdrivers          00000030 0000000000000000 0000000003d6f000 
 48 .exit.text                 00012291 ffffffff83ed3d10 0000000003ed3d10 TEXT
 49 .rela.exit.text            0001f548 0000000000000000 0000000003d6f000 
 50 .exit.data                 000042f0 ffffffff83ee5fa8 0000000003ee5fa8 
 51 .rela.exit.data            0000c8d0 0000000000000000 0000000003d6f000 
 52 .smp_locks                 0000a000 ffffffff83eeb000 0000000003eeb000 DATA
 53 .rela.smp_locks            0003a128 0000000000000000 0000000003d6f000 
 54 .data_nosave               00001000 ffffffff83ef5000 0000000003ef5000 DATA
 55 .bss                       0090a000 ffffffff83ef6000 0000000003ef6000 BSS
 56 .brk                       0002c000 ffffffff84800000 0000000004800000 BSS
 57 .debug_aranges             0002b340 0000000000000000 0000000003d6f000 DEBUG
 58 .rela.debug_aranges        00032250 0000000000000000 0000000003d6f000 
 59 .debug_info                0cccbe5b 0000000000000000 0000000003d6f000 DEBUG
 60 .rela.debug_info           12fef778 0000000000000000 0000000003d6f000 
 61 .debug_abbrev              0056e094 0000000000000000 0000000003d6f000 DEBUG
 62 .debug_line                01805221 0000000000000000 0000000003d6f000 DEBUG
 63 .rela.debug_line           00052d70 0000000000000000 0000000003d6f000 
 64 .debug_frame               003c6860 0000000000000000 0000000003d6f000 DEBUG
 65 .rela.debug_frame          002b21e0 0000000000000000 0000000003d6f000 
 66 .debug_str                 003fb3fd 0000000000000000 0000000003d6f000 DEBUG
 67 .debug_loc                 03b79d36 0000000000000000 0000000003d6f000 DEBUG
 68 .rela.debug_loc            04c0dfe8 0000000000000000 0000000003d6f000 
 69 .debug_ranges              00ae64f0 0000000000000000 0000000003d6f000 DEBUG
 70 .rela.debug_ranges         0130d070 0000000000000000 0000000003d6f000 
 71 .comment                   00000026 0000000000000000 0000000003d6f000 
 72 .symtab                    002efcf8 0000000000000000 0000000003d6f000 
 73 .strtab                    0027be41 0000000000000000 0000000003d6f000 
 74 .shstrtab                  0000028d 0000000000000000 0000000003d6f000

报错Unknown error -22 在 errno 中,-22 通常代表 EINVAL,即 “Invalid argument”(无效参数)。极有可能是抽取DWARF组成BTF时报错,参数不正确导致,更换版本可以尝试解决。