我正在开发一个XDP程序,当我试图在NIC驱动程序中挂载它时,我遇到了这个错误:
libbpf: failed to guess program type based on ELF section name '.text'
libbpf: supported section(type) names are: socket kprobe/ uprobe/ kretprobe/ uretprobe/ classifier action tracepoint/ tp/ raw_tracepoint/ raw_tp/ tp_btf/ xdp perf_event lwt_in lwt_out lwt_xmit lwt_seg6local cgroup_skb/ingress cgroup_skb/egress cgroup/skb cgroup/sock cgroup/post_bind4 cgroup/post_bind6 cgroup/dev sockops sk_skb/stream_parser sk_skb/stream_verdict sk_skb sk_msg lirc_mode2 flow_dissector cgroup/bind4 cgroup/bind6 cgroup/connect4 cgroup/connect6 cgroup/sendmsg4 cgroup/sendmsg6 cgroup/recvmsg4 cgroup/recvmsg6 cgroup/sysctl cgroup/getsockopt cgroup/setsockopt
libbpf: load bpf program failed: Invalid argument
libbpf: -- BEGIN DUMP LOG ---
libbpf:
number of funcs in func_info doesn't match number of subprogs
processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
libbpf: -- END LOG --
libbpf: failed to load program '.text'我搜索并发现,当eBPF验证器试图比较attr->func_info_cnt和env->subprog_cnt时,出现了错误,但我不明白在验证器处理之前如何设置这两个值。我有一个XDP程序与一个部分和6个功能作为帮助,我不确定这个信息是否可以帮助,但我可以提供更多关于程序的结构,如果需要。
发布于 2021-09-15 14:07:04
你没有把你的节目放在一个专门的ELF部分吗?类似于:
SEC("xdp")
int my_prog(struct xdp_md *ctx)
{
...
}(其中SEC()是在libbpf的bpf_helpers.h头中定义的宏。)
如果您没有指定任何ELF节名,则clang/LLVM默认为.text,如您的错误消息中所示。当尝试用libbpf加载程序时,库通常根据程序所在的ELF部分的名称猜测程序类型。如果您不使用专用的节名,并且不指定程序类型(例如,在libbpf中使用bpf_program__set_type()),那么libbpf将无法为您的程序选择相关的类型。
这可能导致您的一些程序无法加载。从上面的错误消息来看,您似乎在程序中使用函数调用(而不是将您的函数声明为static inline)。当您的主程序通过验证器时,一些部分将丢失:“函数”可能没有加载,因此验证程序抱怨从主程序(env->subprog_cnt)推断出的函数/子程序的预期数量与加载程序应用程序(attr->func_info_cnt)收集的函数数(attr->func_info_cnt)不同,并在用bpf()系统调用加载程序时传递给内核。
如果是这样的话,您可能可以通过将您的代码放在专用的ELF函数( static inline )中的来解决这个问题,如果您不需要在生成的字节码中调用函数,则可以通过将您的函数声明为。
https://stackoverflow.com/questions/69192685
复制相似问题