如何解决libbpf无法识别ELF段'filter'的BPF程序类型问题?
问题解决办法
核心原因
libbpf依赖eBPF程序的ELF段(section)名称自动识别程序类型,你使用的SEC("filter")不属于libbpf支持的段名,导致无法推断程序类型,加载失败。
具体修复方案
从代码使用struct __sk_buff参数来看,你大概率是要编写Socket Filter或**TC(流量控制)**类型的eBPF程序,对应修改SEC宏的参数即可:
情况1:Socket Filter程序
如果是用于过滤套接字数据包,将段名改为socket:
SEC("socket") int icmp_timestamp(struct __sk_buff *skb) { // Load the Ethernet protocol void *data_end = (void *)(long)skb->data_end; void *data = (void *)(long)skb->data; struct ethhdr *eth = data; // 后续业务逻辑... }
情况2:TC程序
如果是用于TC流量控制的分类器或动作,使用对应段名:
- 分类器:
SEC("tc")或SEC("classifier") - 动作:
SEC("action")
示例:
SEC("tc") int icmp_timestamp(struct __sk_buff *skb) { // Load the Ethernet protocol void *data_end = (void *)(long)skb->data_end; void *data = (void *)(long)skb->data; struct ethhdr *eth = data; // 后续业务逻辑... }
额外说明
如果你的程序属于其他类型(如kprobe、tracepoint等),需使用错误提示中列出的支持段名,比如:
- kprobe程序:
SEC("kprobe/目标内核函数名") - tracepoint程序:
SEC("tracepoint/分类名/事件名")
内容的提问来源于stack exchange,提问作者Rohan Aluguri
相关产品推荐
相关产品推荐

