如何编译没有调试符号的eBPF程序并附加BTF信息?

问题描述 投票:0回答:1

我尝试在不使用 -g 选项的情况下编译 eBPF 程序,但仍然需要将 BTF(BPF 类型格式)信息附加到生成的目标文件中。我正在开发 LLVM ir pass,到目前为止我不想处理调试信息。 我正在寻找有关如何执行以下操作的详细分步指南:

编译 eBPF 程序而不包含调试符号。 将 BTF 信息附加到已编译的 eBPF 目标文件中。 任何建议或示例命令将不胜感激。预先感谢!

这是我迄今为止尝试过的:

  • 使用
    clang -target bpf -o prog.o prog.c
  • 编译 eBPF 程序
  • 尝试使用各种工具手动附加BTF信息,但没有成功。例如,我尝试从另一个已编译(带有调试符号)的 eBPF 程序中获取
    llvm-objcopy
    部分,但验证程序拒绝了该程序。
linux debugging clang llvm ebpf
1个回答
0
投票

尝试相反的方法怎么样?您可以使用调试信息进行编译(

-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

© www.soinside.com 2019 - 2024. All rights reserved.