linux-kernel - bpf_asm 在编译时返回单个 '
问题描述
我是伯克利数据包过滤器的新手。我正在尝试学习如何手动滚动我自己的 bpf 代码,然后使用 bpf_asm 编译它。我正在使用内核 4.4.0-137 开发 ubuntu 16.04。我已经下载了源代码,并且正在阅读推荐的阅读材料,Documentation/networking
特别是[filter.txt][1]
. 我使用提供的 makefile安装binutils
、构建和安装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 unknown character”,我觉得这有点奇怪,因为我将文本filter.txt
直接从一个新文件中拉出来。使用 bpf_exp.l 我在 for 的产生中发现了一些奇怪的行为.
,它用于捕获任何其他词法分析器未捕获的输出并输出错误。将这些评论出来......这可能是一个糟糕的主意,我能够产生 bpf 输出。但是,它并不等同于filter.txt
建议的输出。但是,它确实包含与输入的 bpf 相同的行数,并且在运行它之后bpf_dbg
程序我恢复了我输入的相同输出。这个程序不再维护了吗?或者我仍然没有正确使用它?此外,输入 bpf 程序似乎很难filter.txt
作为建议的程序输出,因为我不相信解析器对输出代码有任何优化。因此,它似乎需要具有相同数量的行。这是一个正确的假设吗?
解决方案
推荐阅读
- docker - Docker Compose:暴露不起作用
- php - Telegram Bot 没有同时进行查询(sendMessage、deleteMessage)?
- mysql - 当行值不等于特定值时更新表
- c# - 在 OpenXML 中创建图片内容控件
- php - Laravel URL 重定向
- arrays - 验证数组响应 http GET Rest-Assured
- haskell - Haskell中是否有类似字典的东西?
- php - 使用 php 读取凌乱的 JSON
- amazon-ec2 - DB2 db2prereqcheck 如何使其工作?
- nopcommerce - 删除旧滑块并从主页 Nopcommerce Ver-3.90(Prisma 主题)中删除选定/特色产品