bpf_asm возвращает сингл при компиляции - PullRequest
0 голосов
/ 18 ноября 2018

Я новичок в Berkeley Packet Filter.Я пытаюсь узнать, как вручную свернуть мой собственный код bpf, а затем скомпилировать его, используя bpf_asm.Я работаю на Ubuntu 16.04 с ядром 4.4.0-137.Я скачал исходный код и прохожу рекомендуемое чтение в Documentation/networking, в частности [filter.txt][1].Я установил binutils, собрал и установил bpf_asm, расположенный в tools/net, используя предоставленный make-файл.Кажется, все к этому моменту прошло хорошо.Когда я запускаю 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?Спасибо.

Edit

После более внимательного прочтения кода я обнаружил, что bpf_exp.y вызывает yyerror.С сообщением «lex неизвестный символ», что я нахожу несколько странным, поскольку я вытащил текст из filter.txt прямо в новый файл.Играя с bpf_exp.l, я обнаружил странное поведение в ., которое используется для перехвата любого вывода, который не перехватывается остальной частью лексера, и вывода ошибки.Комментируя это ... что, вероятно, ужасная идея, я смог произвести вывод bpf.Однако это не эквивалентно тому, что filter.txt предлагает в качестве вывода.Однако он содержит то же количество строк, что и введенный bpf, и после запуска его через программу bpf_dbg я восстановил тот же вывод, который я ввел.Эта программа больше не поддерживается?Или я все еще не правильно его использую?Кроме того, может показаться, что входная bpf-программа из filter.txt будет очень трудно выводиться как предлагаемая программа, поскольку я не верю, что анализатор имеет какую-либо оптимизацию для выходного кода.Следовательно, казалось бы, что оно должно иметь одинаковое количество строк.Это правильное предположение?

...