EBPF: арифметика указателя c на PTR_TO_PACKET_END запрещена - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь написать модуль ядра для фильтрации, используя следующий пример . В 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
...