我尝试在不使用 -g 选项的情况下编译 eBPF 程序,但仍然需要将 BTF(BPF 类型格式)信息附加到生成的目标文件中。我正在开发 LLVM ir pass,到目前为止我不想处理调试信息。 我正在寻找有关如何执行以下操作的详细分步指南:
编译 eBPF 程序而不包含调试符号。 将 BTF 信息附加到已编译的 eBPF 目标文件中。 任何建议或示例命令将不胜感激。预先感谢!
这是我迄今为止尝试过的:
clang -target bpf -o prog.o prog.c
llvm-objcopy
部分,但验证程序拒绝了该程序。尝试相反的方法怎么样?您可以使用调试信息进行编译(
-g
),然后删除您不想要的内容:
clang -g -target bpf -o prog.o prog.c
llvm-objcopy --remove-section=.debug_abbrev \
--remove-section=.debug_info --remove-section=.debug_str_offsets \
--remove-section=.debug_str --remove-section=.debug_addr \
--remove-section=.debug_frame --remove-section=.debug_line \
--remove-section=.debug_line_str --remove-section=.debug_loclists \
--remove-section=.debug_rnglists \
prog.o prog.stripped.o
在我的例子中(Clang 18),这会产生与没有调试信息相同的 ELF,除了我有 4 个额外的 BTF 部分:
.BTF
、.rel.BTF
、.BTF.ext
和 .rel.BTF.ext
。