无法附加 eBPF blob
fail to attach eBPF blob
我刚刚从内核 tools/testing/selftests/bpf
编译了 BPF 示例,并尝试按照 http://cilium.readthedocs.io/en/v0.10/bpf/:
中的说明加载
% tc filter add dev enp0s1 ingress bpf \
object-file ./net-next.git/tools/testing/selftests/bpf/sockmap_parse_prog.o \
section sk_skb1 verbose
Program section 'sk_skb1' not found in ELF file!
Error fetching program/map!
这发生在 Ubuntu 16.04.3 LTS 内核 4.4.0-98,llvm
和 clang
版本 3.8 从软件包安装,iproute2
是最新来自 github.
我怀疑我 运行 有一些 toolchain/kernel version/features 不匹配。
我做错了什么?
我不知道 tc 为什么抱怨。在我的设置中,使用类似的命令,程序加载。不过,这里有一些提示:
我认为如您所言,问题可能来自内核头文件版本与 iproute2 之间的某些不兼容,并且某些重定位未能发生,尽管在快速调查中,我没有找到它拒绝加载该部分的确切原因。在我这边,我使用的是 clang-3.8,最新的 iproute2,还有最新的内核(一些提交接近 4.14)。
如果您设法以某种方式加载该部分,我相信您在尝试将程序附加到内核时仍然会遇到问题。该功能称为“direct packet access” is only present on kernels 4.7 and higher。这就是使您能够在程序中使用 skb->data
和 skb->data_end
的原因。
然后作为旁注,这个程序sockmap_parse_prog.c
不打算与tc一起使用。它应该直接连接到套接字(在同一目录的文件 test_maps.c
中搜索 SOCKMAP_PARSE_PROG
以查看它是如何加载到那里的)。从技术上讲,这不会阻止将程序附加为 tc 过滤器,但它可能无法按预期工作。特别是,从程序返回的值可能没有 tc 分类器钩子理解的含义。
所以我建议您尝试使用最新的内核,看看您是否更成功。或者,尝试编译和 运行 您可以在自己的内核源代码中找到的示例。祝你好运!
我刚刚从内核 tools/testing/selftests/bpf
编译了 BPF 示例,并尝试按照 http://cilium.readthedocs.io/en/v0.10/bpf/:
% tc filter add dev enp0s1 ingress bpf \
object-file ./net-next.git/tools/testing/selftests/bpf/sockmap_parse_prog.o \
section sk_skb1 verbose
Program section 'sk_skb1' not found in ELF file!
Error fetching program/map!
这发生在 Ubuntu 16.04.3 LTS 内核 4.4.0-98,llvm
和 clang
版本 3.8 从软件包安装,iproute2
是最新来自 github.
我怀疑我 运行 有一些 toolchain/kernel version/features 不匹配。
我做错了什么?
我不知道 tc 为什么抱怨。在我的设置中,使用类似的命令,程序加载。不过,这里有一些提示:
我认为如您所言,问题可能来自内核头文件版本与 iproute2 之间的某些不兼容,并且某些重定位未能发生,尽管在快速调查中,我没有找到它拒绝加载该部分的确切原因。在我这边,我使用的是 clang-3.8,最新的 iproute2,还有最新的内核(一些提交接近 4.14)。
如果您设法以某种方式加载该部分,我相信您在尝试将程序附加到内核时仍然会遇到问题。该功能称为“direct packet access” is only present on kernels 4.7 and higher。这就是使您能够在程序中使用
skb->data
和skb->data_end
的原因。然后作为旁注,这个程序
sockmap_parse_prog.c
不打算与tc一起使用。它应该直接连接到套接字(在同一目录的文件test_maps.c
中搜索SOCKMAP_PARSE_PROG
以查看它是如何加载到那里的)。从技术上讲,这不会阻止将程序附加为 tc 过滤器,但它可能无法按预期工作。特别是,从程序返回的值可能没有 tc 分类器钩子理解的含义。
所以我建议您尝试使用最新的内核,看看您是否更成功。或者,尝试编译和 运行 您可以在自己的内核源代码中找到的示例。祝你好运!