Я новичок в 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
будет очень трудно выводиться как предлагаемая программа, поскольку я не верю, что анализатор имеет какую-либо оптимизацию для выходного кода.Следовательно, казалось бы, что оно должно иметь одинаковое количество строк.Это правильное предположение?