运维开发网

如何获得linux ebpf程序集?

运维开发网 https://www.qedev.com 2020-05-19 10:19 出处:网络
我想学习 linux ebpf vm,如果我写一个ebpf程序test.c,用过llvm: clang -O2 -target bpf -o test.o test.c.如何在经典bpf中获得像tcpdump -d这样的ebpf程序集,谢谢.
我想学习 Linux ebpf vm,如果我写一个ebpf程序test.c,用过llvm:

clang -O2 -target bpf -o test.o test.c.如何在经典bpf中获得像tcpdump -d这样的ebpf程序集,谢谢. 这取决于你对“学习Linux ebpf vm”的意思.

语言本身

如果你的意思是学习eBPF的指令,就像汇编一样的语言本身,你可以看一下the documentation from the kernel(非常密​​集)或者来自bcc项目的this summarized version of the syntax.

虚拟机

如果你想看看eBPF虚拟机的内部是如何工作的,你可以看看各种演示文稿(我推荐来自D. Borkmann的那些),我在这里有一个列表in this blog post;或者您可以直接在Linux / kernel / bpf(特别是文件core.c)下的内核源代码中读取.或者,有一个simpler userspace implementation可用.

转储eBPF指令

现在,如果你想看到从C编译到eBPF的代码,这里有几个解决方案.

读取目标文件

就我而言,我使用tc-bpf man page中提供的命令进行编译:

__bcc() {
        clang -O2 -emit-llvm -c $1 -o - | \
        llc -march=bpf -filetype=obj -o "`basename $1 .c`.o"
}
alias bcc=__bcc

代码被翻译成eBPF并存储在生成的ELF文件的一个部分中.然后我可以使用objdump或readelf等工具检查我的程序.例如,如果我的程序在分类器部分中:

$bcc return_zero.c
$readelf -x classifier return_zero.o

Hex dump of section 'classifier':
   0x00000000 b7000000 02000000 95000000 00000000 ................

在上面的输出中,显示了两条指令(小端 – 以0x开头的第一个字段是节内的偏移量).我们可以解析这个以形成指令并获得:

b7 0 0 0000 00000002 // Load 0x02 in register r0
95 0 0 0000 00000000 // Exit and return value in r0

高级工具

根据您用于将BPF注入内核的工具,您通常可以转储内核验证程序的输出,该验证程序包含以人性化方式格式化的大多数指令.

使用bcc set of tools(与上一个命令没有直接关系,并且与旧的16位编译器没有任何关系),您可以获取此by using the relevant flags用于BPF对象实例,而使用tc filter add dev eth0 bpf obj … verbose这是使用verbose关键字完成.

反汇编

前面提到的用户空间实现(uBPF)有自己可能感兴趣的汇编器和反汇编器:它将“人性化”(add32 r0,r1和like)指令作为输入并转换为目标文件,或者其他分别是.

但可能更有意思的是,在LLVM本身中支持调试信息,以及BPF反汇编程序:截至今天它已经合并,其作者(A. Starovoitov)已经在netdev邮件上发送了an email名单.这意味着使用clang / LLVM 4.0,您应该能够使用llvm-objdump -S -no-show-raw-insn my_file.o来获得格式良好的输出.

0

精彩评论

暂无评论...
验证码 换一张
取 消