如何从内核树构建 BPF 程序

2023-11-27

内核提供了许多示例samples/bpf。我有兴趣在树之外构建一个示例,就像我们构建一个内核模块一样,其中Makefile可以很简单。是否可以对 bpf 执行相同的操作?我尝试从中删除不必要的部分samples/bpf/Makefile并保持依赖关系libbpf和其他人,然而事实证明这并不那么容易。

例如,尝试构建samples/bpf/bpf_tcp_kern.c在内核树之外,使用以下命令行(我查看了样本/bpf/Makefile,以及输出make samples/bpf V=1):

clang -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/5/include \
        -I/home/mark/work/net-next.git/arch/x86/include -I/home/mark/work/net-next.git/arch/x86/include/generated -I./include -I/home/mark/work/net-next.git/arch/x86/include/uapi -I/home/mark/work/net-next.git/arch/x86/include/generated/uapi -I/home/mark/work/net-next.git/include -I/home/mark/work/net-next.git/generated/uapi  -I./ \
        -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \
        -D__TARGET_ARCH_x86 -Wno-compare-distinct-pointer-types \
        -Wno-gnu-variable-sized-type-not-at-end \
        -Wno-address-of-packed-member -Wno-tautological-compare \
        -Wno-unknown-warning-option  \
        -O2 -emit-llvm -c bpf_tcp_kern.c -o -| llc -march=bpf -filetype=obj -o bpf_tcp_kern.o
In file included from bpf_tcp_kern.c:15:
In file included from /home/mark/work/net-next.git/include/uapi/linux/bpf.h:11:
In file included from /home/mark/work/net-next.git/include/linux/types.h:6:
In file included from /home/mark/work/net-next.git/include/uapi/linux/types.h:5:
/home/mark/work/net-next.git/arch/x86/include/uapi/asm/types.h:5:10: fatal error: 'asm-generic/types.h' file not found
#include <asm-generic/types.h>
         ^
1 error generated

这是与clang-llvm 3.8.0

我需要libbpf构建用户端 bpf 应用程序。这部分工作构建得很好。

我错过了什么吗?我相信这个任务应该相当容易;-)


假设这是“eBPF”。是的,那应该是可能的。基本上,您应该能够使用如下内容编译最简单的 eBPF 程序:

clang -O2 -emit-llvm -c bpf.c -o - | llc -march=bpf -filetype=obj -o bpf.o

(取自手册页tc-bpf(8))

当然,如果您的程序使用本地头文件中的定义,您必须找到一种方法来包含它们(即,从这些头文件中保留足够的内容来编译您的文件,即使您“撕掉”其他所有内容)。

一些注意事项:

  • clang 和 llvm (llc) 应该是 3.7 或更高版本(越高越好)。
  • 根据您尝试编译的 eBPF 功能,您将需要内核标头(特别是,<linux/bpf.h>)足够新以支持您的计划(另请参阅这一页).
  • 不确定您打算使用什么libbpf为了。如果我没记错的话,它用于从外部程序加载和管理 eBPF 程序,而不是包含在 eBPF 程序本身中?
  • [Edit]还有 eBPF 计划samples/bpf似乎是用内核模块基础设施构建的。他们是not模块本身,但以某种方式编译,就好像它们一样,可以访问内核头文件。因此,如果您尝试在树之外编译它们并且没有内核 makefile,您可能会失去对<linux/*.h>标头,并且必须替换<uapi/linux/*.h> by <linux/*.h>反而..

作为一般建议,尝试简化程序直到编译,然后再次添加功能:)。恐怕如果没有源代码或错误消息,就无法真正为您提供更多帮助。祝你好运!

[Edit问题本身更新后] 我能够通过将以下三行添加到命令来编译示例(通过运行获得它们)make samples/bpf/tcp_bufs_kern.o V=1,不确定你是否将它们修剪掉或者你是否得到了不同的东西):

…
-I/home/mark/work/net-next.git/include/generated/uapi \
-I/home/mark/work/net-next.git/tools/testing/selftests/bpf/ \
-include /home/mark/work/net-next.git/include/linux/kconfig.h \
…

第一行为asm-generic.h您的命令抱怨的标头;第二行是为了"bpf-helpers.h",您可以轻松地将其复制到您的工作目录。最后一行可能更难删除,我没有详细搜索原因kconfig.h是需要的,你必须对此进行调查。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从内核树构建 BPF 程序 的相关文章

  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 树莓派的设备树驱动内核

    我想用设备树驱动的 Linux 内核启动树莓派 有什么特别的事情要做吗 谁能指出为树莓派设置基于设备树的内核启动需要什么 我可能需要有树莓派内核源代码 其中设备驱动程序应与设备树兼容 如果是这样 我在哪里可以找到 Raspberry Pi
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • Linux内核container_of宏和C90中的通用容器

    是否有可能实施容器的 http lxr linux no linux tools perf util include linux kernel h L18纯C90中的宏 我不确定如何做到这一点 因为内核实现取决于海湾合作委员会黑客 http
  • 如何从 LLVM 指令获取文件名和目录?

    我需要在 llvm 过程中提取目录和文件名 当前版本的 llvm 已移动getFilename and getDirectory from DebugLoc to DebugInfoMetadata 我找不到班级成员getFilename直
  • 当 mov 指令导致页面错误并且在 x86 上禁用中断时会发生什么?

    我最近在自定义 Linux 内核 2 6 31 5 x86 驱动程序中遇到一个问题 其中 copy to user 会定期不将任何字节复制到用户空间 它将返回传递给它的字节数 表明它没有复制任何内容 经过代码检查 我们发现代码在调用 cop
  • 在许多驱动程序文件夹中创建 build-in.o

    我正在用我的自定义驱动程序构建内核 成功构建后 我发现了许多 build in o 文件 任何人都可以详细说明这些文件是如何在这里结束的吗 我只能怀疑这些与更高级别的 makefile 有关 built in o 文件是未构建为模块的内核的
  • 读取文件而不从操作系统页面缓存中逐出

    这主要适用于 Linux 或者理想情况下适用于任何 POSIX 系统 当我阅读以下页面时 我正在寻找一种读取大量文件 其中任何一个文件本身可能高达 1GB 的方法 具有以下特征 如果相关磁盘页面已在文件系统缓存中 则使用该页面 如果相关页面
  • 引用与指针的执行速度

    我最近阅读了一篇关于托管语言是否比本机语言 特别是 C 与 C 慢 或快 的讨论 一位参与讨论的人士表示 托管语言的 JIT 编译器将能够对引用进行优化 而这在使用指针的语言中是不可能实现的 我想知道的是 对于引用而不是指针可以进行 什么样
  • 如何从外部模块导出符号?

    我在内核源代码树之外进行编码 有两个模块 第一个printt有一个功能printtty 将字符串打印到当前 tty 以及第二个模块hello这会调用printtty 在初始化期间 我已经添加了EXPORT SYMBOL printtty 在
  • ftrace 是否允许捕获 Linux 内核的系统调用参数,或者仅捕获函数名称?

    目标是检查任何进程传递给特定系统调用 例如 exec open 等 的参数 来自官方文档 https www kernel org doc Documentation trace ftrace txt 没有描述记录函数参数的功能 主要查看
  • 多线程进程的线程ID可以与另一个正在运行的进程的进程ID相同吗?

    我正在尝试找到一种方法来唯一标识多进程环境中的线程 我有一个服务器 它跟踪连接到它的不同进程 其中一些是多线程的 一些不是 为了识别多线程连接中的线程 我使用线程 ID 作为唯一标识符 在任何给定时间最多有 1 个多线程进程连接 我的问题是
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 为什么 Python 对于一个简单的 for 循环来说这么慢?

    我们正在做一些kNN and SVDPython 中的实现 其他人选择了 Java 我们的执行时间非常不同 我使用 cProfile 来查看我在哪里犯了错误 但一切都很好fine http wiki python org moin Pyth
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 找到对应的未经V8优化的JS代码源

    我尝试优化 node js 应用程序的性能 因此我正在分析 V8 的 JIT 编译器的行为 当通过运行应用程序时node trace deopt trace opt code comments print optcode 输出包含许多重复出

随机推荐

  • 使用 hibernate jpa 进行 JSON 序列化和反序列化,以便在 JSON 响应中将父对象转换为子对象

    我正在使用 Spring 框架 Hibernate 和 JSON 开发 Rest Web 应用程序 请假设我有两个实体 如下所示 基础实体 java MappedSuperclass JsonIdentityInfo generator O
  • 为什么 regex_match 会抛出“复杂性异常”?

    我正在尝试测试 使用boost regex 文件中的行是否仅包含由空格分隔的数字条目 我遇到了一个我不明白的异常 见下文 如果有人能解释为什么会抛出它 那就太好了 也许我在定义模式时做了一些愚蠢的事情 这是代码 regex test cpp
  • 异步分派递归块

    假设我运行这段代码 block int step 0 block dispatch block t myBlock myBlock if step STEPS COUNT return step dispatch time t delay
  • Java 中的排出标准错误

    从 Java 启动进程时 如果我不从管道读取数据 stderr 和 stdout 都会阻塞输出 目前 我有一个线程主动从一个线程读取数据 而主线程则在另一个线程上阻塞 有没有一种简单的方法来连接两个流或以其他方式导致子进程继续 同时不丢失
  • delegate.Invoke 如何工作?

    如果我在代码中创建一个委托 例如 delegate void dostuff string o 这会生成一个派生自的类System MulticastDelegate它实现了三种方法 Invoke BeginInvoke and EndIn
  • jQuery:当“dblclick”即将发生时抑制“click”?

    假设我有一个 span 当您单击此跨度时 我想要一个save 功能来开火 当您双击跨度时 我想要一个rename 功能来开火 但是 如果双击跨度 首先click事件将会触发 然后dblclick事件 自从click先于dblclick 我怎
  • Flutter 中的 VoidCallback 是如何工作的?

    我从互联网上了解到的信息是无效回调 是不带参数也不返回任何参数的函数 以下代码来自应用程序 并且该应用程序运行良好 我想问一下使用 VoidCallback 作为type而不是作为function 我是 Flutter 开发的绝对初学者 请
  • _int64 没有命名类型

    In my pch文件我有以下定义 if MSC VER lt 1300 typedef signed char int8 t typedef signed short int16 t typedef signed int int32 t
  • 如何使用javascript调用按钮点击事件背后的代码

    是否可以使用 javascript 或 jquery 调用服务器端按钮单击事件 如果是的话该怎么做 假设这是你的 html
  • 检查浏览器通知是否可用

    我正在处理浏览器通知 因为它不适用于我想签入的每个浏览器JS code 如果可用的话 我查看了 Mozilla 开发者部分 https developer mozilla org en US docs Web API Notificatio
  • JQuery 多个选择器,$(this) 引用?

    鉴于以下 identifier div first idetifier2 fadeOut 300 function I need to reference just the identifier div first element howe
  • 递归计算 DataFrame 值

    我正在尝试 递归 计算 pandas 数据框的列值 假设有两个不同日期的数据 每个日期有 10 个观测值 并且您想要计算某个变量 r 其中仅给出 r 的第一个值 每天 并且您想要计算剩余的 2 9 条目 而每个后续值取决于在 r 的前一个条
  • 如何按第一维对张量进行排序

    我有一个 2D 张量 我想按第一个维度排序 如下例所示 a torch FloatTensor 5 5 5 3 3 5 6 4 3 7 我预计排序后的结果是这样的 a torch FloatTensor 3 5 3 7 5 3 5 5 6
  • 尝试对 var/www/html 使用符号链接

    这就是我想要实现的目标 从中创建符号链接var www html到主目录中的目录 文件夹 我试图在 home 中符号链接到的目录 是一个 git 存储库 如果这有什么区别的话 我在这个目录中有一个index html 文件 我使用以下命令在
  • 如何在 MySQL 中插入大量行?

    例如 如何使用单个查询将 100 000 行插入 MySQL 表中 insert into table values 1 a b 2 c d 3 e f 这将执行 3 行的插入 根据需要继续达到 100 000 在进行 ETL 工作时 我会
  • 使用元类理解 __call__ [重复]

    这个问题在这里已经有答案了 据我了解 call 类中的方法实现了函数调用运算符 例如 class Foo def init self print I m inside the init method def call self print
  • 在Linux Ubuntu下启动时自动运行程序[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 每次启动 Ubuntu Linux 时我都需要运行一个程序 所以我需要将其添加到我的启动程序列表中 只有一个问题 我需要通过终端来完成此操作 sudo mv filename etc
  • 使用 jquery 根据
    标签拆分字符串

    我如何分割包含的字符串 br 使用 jquery 进行标记 我尝试了以下代码 但在控制台中出现错误 我不知道如何根据分割字符串 br 标签 这是我尝试过的代码 jQuery document ready function var lines
  • 如何计算一个数字最接近的 2 或 10 次方?

    计算 2 或 10 与另一个数字最接近的幂的最有效方法是什么 例如 3 5 对于 2 的幂返回 4 对于 10 的幂返回 1 123 将返回 2 的幂 128 和 10 的幂 100 0 24 对于 2 的幂返回 0 25 对于 10 的幂
  • 如何从内核树构建 BPF 程序

    内核提供了许多示例samples bpf 我有兴趣在树之外构建一个示例 就像我们构建一个内核模块一样 其中Makefile可以很简单 是否可以对 bpf 执行相同的操作 我尝试从中删除不必要的部分samples bpf Makefile并保