Я пытаюсь написать модуль ядра для фильтрации, используя следующий пример . В Ubuntu 18.04 с ядром 5.3.0 он скомпилирован и работает отлично.
Однако, когда тот же пример скомпилирован на Debian 10 с ядром 4.19.0, компиляция выдает другой байт-код, который отклоняется при попытке загрузить его в ядро с помощью верификатора ядра с ошибкой:
Prog section 'action' rejected: Permission denied (13)!
- Type: 4
- Instructions: 108 (0 over limit)
- License: GPL
Verifier analysis:
0: (bf) r6 = r1
1: (61) r2 = *(u32 *)(r6 +84)
2: (67) r2 <<= 32
3: (61) r1 = *(u32 *)(r6 +80)
4: (4f) r2 |= r1
R2 pointer arithmetic on PTR_TO_PACKET_END prohibited
Error fetching program/map!
bad action parsing
parse_action: bad value (6:bpf)!
Illegal "action"
В чем может быть проблема? Есть ли где-то ошибка в ядре, компиляторе, верификаторе или примере? Версии clang и ll c совпадают в обеих системах: 6.0.0 для обеих.
Обновление 1: версии ОС:
- Ubuntu: Linux 5.3.0- 40-generi c # 32 ~ 18.04.1-Ubuntu SMP x86_64 GNU / Linux
- Debian: Linux 4.19.0-6-686-pae # 1 SMP Debian 4.19.67-2 + deb10u2 (2019-11-11) i686 GNU / Linux
Версии компиляторов:
- Ubuntu: версия clang 6.0.0-1ubuntu2 (теги / RELEASE_600 / конечный); Цель: x86_64-p c - linux -gnu
- Debian: версия clang 6.0.1-10 (tags / RELEASE_601 / final); Цель: i686-p c - linux -gnu