首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在内核树之外编译ebpf _kern.c并将独立的libbpf链接到_user.c

在内核树之外编译ebpf _kern.c并将独立的libbpf链接到_user.c
EN

Stack Overflow用户
提问于 2019-08-01 13:59:06
回答 1查看 635关注 0票数 1

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

问题:--我遵循了以下步骤

1)构建libbpf

代码语言:javascript
复制
git clone https://github.com/libbpf/libbpf.git
cd src
make

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

3)用

代码语言:javascript
复制
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内容有关。e.g

代码语言:javascript
复制
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

代码语言:javascript
复制
#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";

问题:

项目树是:

代码语言:javascript
复制
libbpf
  |src
    |libbpf.a
    |libbpf.so
    |...
libbpfebpf
  |bpf_headers.h
  |mine_kern.c
  |mine_user.c

我怎样才能纠正错误?修复后,就可以用gcc-L../libbpf/src编译gcc-L../libbpf/src来链接libbpf.so了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-01 14:25:29

你在运行什么内核?您的内核似乎不支持bpf_sock_ops_cb_flags_set() BPF助手(/usr/include/linux/bpf.h中缺少)。它是在Linux4.17中添加的,所以如果您的内核比这更旧,那么从bpf_helpers.h中删除它的定义(以及所有后续的帮助程序)。这不应该是编译你的程序的一个问题,除非你打算使用其中一个最近的帮助。

或者,升级内核。

是的,我认为把-L旗传给gcc就足够了,告诉它哪里可以找到柳条。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57310788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档