【问题标题】:Compile ebpf _kern.c outside the kernel tree and link stand alone libbpf to _user.c在内核树外编译 ebpf _kern.c 并将独立的 libbpf 链接到 _user.c
【发布时间】:2019-08-01 13:59:06
【问题描述】:

目标:使用独立的libbpfclang 在内核树之外构建一个ebpf 程序

问题:我遵循了这些步骤

1) 构建libbpf

git clone https://github.com/libbpf/libbpf.git
cd src
make

2) 从我的内核 src /tools/testing/selftests/bpf/bpf_helpers.h 复制 bpf_helpers.h

3) 编译

clang -S -I. -O2 -Wall -Werror -emit-llvm -c mine_kern.c -o - | llc -march=bpf -filetype=obj -o mine_kern.o

但结果我有很多与bpf_helpers.h 内容相关的错误。例如

In file included from mine_kern.c:7:
./bpf_helpers.h:75:11: error: use of undeclared identifier
      'BPF_FUNC_sock_ops_cb_flags_set'
        (void *) BPF_FUNC_sock_ops_cb_flags_set;
                 ^

mine_kern.c

#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/ip.h>
#include <linux/in.h>    
#include "bpf_helpers.h"

SEC("socket")
int bpfrog1(struct __sk_buff *skb)
{
        int proto = load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol));

        if (proto == IPPROTO_ICMP && skb->pkt_type == PACKET_OUTGOING)
                return -1;
        else
                return 0;

}
char _license[] SEC("license") = "GPL";

问题:

项目树是:

libbpf
  |src
    |libbpf.a
    |libbpf.so
    |...
libbpfebpf
  |bpf_headers.h
  |mine_kern.c
  |mine_user.c

我该如何解决这个错误?修复后足以编译_user.cgcc-L../libbpf/src 以链接libbpf.so

【问题讨论】:

    标签: kernel clang bpf ebpf


    【解决方案1】:

    你正在运行什么内核?看起来您的内核不支持 bpf_sock_ops_cb_flags_set() BPF 帮助程序(/usr/include/linux/bpf.h 中缺少)。它是在 Linux 4.17 中添加的,因此如果您的内核比这更旧,请从您的 bpf_helpers.h 中删除其定义(以及所有后续帮助程序)。除非您打算使用这些较新的帮助程序之一,否则编译您的程序应该不是问题。

    或者,升级您的内核。

    是的,我认为将-L 标志传递给gcc 告诉它在哪里可以找到libbpf 就足够了。

    【讨论】:

    • 无论如何,你是我的新神。我正在运行 4.18.0-25-generic。我已经安装了运行 sudo apt install linux-source-4.18.0 的 4.18.0 src 代码,然后我从内核 src 代码中复制了 bpf_helpers.h。为什么会出现这种差异?
    • 我整天都在使用 BPF,这很正常,我更熟悉它。嗯,如果你在 4.18 上运行,我不知道你为什么会得到这个错误。 `/usr/include/linux/bpf.h 中有 FN(sock_ops_cb_flags_set) 吗?您收到的其他错误消息是什么,它们是否仅用于后续帮助程序定义?
    • 我想我需要 5 年才能熟悉它 XD。正如你所说,我试图从 sock_ops_cb_flags_set 开始删除 bpf_helpers.h 中的所有帮助程序定义,并完美编译。我仍然不明白为什么我正在运行的内核和源代码之间存在差异。
    • 理论上不应该存在,如果您从与您自己的内核版本相同的源中选择文件。不知道为什么会在你的情况下发生这种情况。 (如果版本不同,错误将是因为bpf_helpers.h 使用了 /usr/include/linux/bpf.h 中的定义,当然如果这些定义不存在,就会出现问题。)
    • 我终于做到了,非常感谢。仍然有100000000000000个疑问。最后我使用了这条线 gcc -I。 -I../libbpf/src/ mine_user.c -o mine_user ../libbpf/src/libbpf.a -lelf 但我不明白为什么使用 -lbpf 而不是 ../libbpf/src 不起作用/libbpf.a
    猜你喜欢
    • 2021-10-03
    • 2019-11-20
    • 2018-09-30
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    相关资源
    最近更新 更多