记一次BTF开启kernel编译报错
现象
最近在编译内核时开启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时报错,参数不正确导致,更换版本可以尝试解决。