首页 > 解决方案 > bpf_asm 在编译时返回单个 '

问题描述

我是伯克利数据包过滤器的新手。我正在尝试学习如何手动滚动我自己的 bpf 代码,然后使用 bpf_asm 编译它。我正在使用内核 4.4.0-137 开发 ubuntu 16.04。我已经下载了源代码,并且正在阅读推荐的阅读材料,Documentation/networking特别是[filter.txt][1]. 我使用提供的 makefile安装binutils、构建和安装bpf_asmtools/net到目前为止,一切似乎都很顺利。当我运行bpf_asm -c bpf_example程序时,会产生一个标准输出的 ' 标记。我正在尝试编译的代码Documentation/networking/filter.txt是为了完整起见,我将其包含在此处提供的示例代码。

  ld [4]                  /* offsetof(struct seccomp_data, arch) */
  jne #0xc000003e, bad    /* AUDIT_ARCH_X86_64 */
  ld [0]                  /* offsetof(struct seccomp_data, nr) */
  jeq #15, good           /* __NR_rt_sigreturn */
  jeq #231, good          /* __NR_exit_group */
  jeq #60, good           /* __NR_exit */
  jeq #0, good            /* __NR_read */
  jeq #1, good            /* __NR_write */
  jeq #5, good            /* __NR_fstat */
  jeq #9, good            /* __NR_mmap */
  jeq #14, good           /* __NR_rt_sigprocmask */
  jeq #13, good           /* __NR_rt_sigaction */
  jeq #35, good           /* __NR_nanosleep */
  bad: ret #0             /* SECCOMP_RET_KILL_THREAD */
  good: ret #0x7fff0000   /* SECCOMP_RET_ALLOW */

中提到的输出filter.txt

$ ./bpf_asm -c foo
{ 0x28,  0,  0, 0x0000000c },
{ 0x15,  0,  1, 0x00000806 },
{ 0x06,  0,  0, 0xffffffff },
{ 0x06,  0,  0, 0000000000 },

但是,我的输出是

./bpf_asm -c bpf_example
'

我显然把事情搞砸了。有人可以指出我忽略了什么,为尝试的事情提供建议,或者提供额外的文献补充filter.txt吗?谢谢你。

编辑

仔细阅读代码后,我发现 bpf_exp.y 正在调用 yyerror。有一条消息“lex unknown character”,我觉得这有点奇怪,因为我将文本filter.txt直接从一个新文件中拉出来。使用 bpf_exp.l 我在 for 的产生中发现了一些奇怪的行为.,它用于捕获任何其他词法分析器未捕获的输出并输出错误。将这些评论出来......这可能是一个糟糕的主意,我能够产生 bpf 输出。但是,它并不等同于filter.txt建议的输出。但是,它确实包含与输入的 bpf 相同的行数,并且在运行它之后bpf_dbg程序我恢复了我输入的相同输出。这个程序不再维护了吗?或者我仍然没有正确使用它?此外,输入 bpf 程序似乎很难filter.txt作为建议的程序输出,因为我不相信解析器对输出代码有任何优化。因此,它似乎需要具有相同数量的行。这是一个正确的假设吗?

标签: linux-kernelbpf

解决方案


推荐阅读