bpf_asm在编译时返回单'

时间:2018-11-17 23:18:53

标签: linux-kernel bpf

我是Berkeley Packet Filter的新手。我正在尝试学习如何手动编写自己的bpf代码,然后使用bpf_asm对其进行编译。我正在使用内核4.4.0-137在ubuntu 16.04上工作。我已经下载了源代码,并且正在按照建议的阅读方式Documentation/networking(尤其是[filter.txt][1])进行工作。我已经安装了binutils,并使用提供的Makefile构建并安装了位于bpf_asm中的tools/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未知字符”,由于我将文本从filter.txt直接拉到一个新文件中,因此我感到有些奇怪。在玩bpf_exp.l时,我在.的生产中发现了一些奇怪的行为,该行为用于捕获其他词法分析器未捕获的任何输出并输出错误。评论那些...这可能是一个糟糕的主意,我能够产生bpf输出。但是,它不等同于filter.txt作为输出的建议。但是,它确实包含与输入的bpf相同的行数,并且在通过bpf_dbg程序运行它之后,我恢复了与输入相同的输出。该程序不再维护吗?还是我仍然没有正确使用它?此外,将filter.txt中的输入bpf程序作为建议的程序输出似乎非常困难,因为我不认为解析器对输出代码有任何优化。因此,似乎它需要具有相同数量的行。这是正确的假设吗?

0 个答案:

没有答案