Сейчас я пытаюсь вставить в ядро некоторый код bpf на основе cilium. В этом руководстве я шаг за шагом следую инструкциям по компиляции с использованием предоставленного Makefile, а затем с помощью bpftool пытаюсь загрузить объектный файл в ядро. К сожалению, он всегда показывает ошибки, как на картинке. Я абсолютно уверен, что установил все связанные зависимости, а также обновить мое ядро до новейшей версии, ссылка на руководство https://github.com/cilium/cilium/tree/main/bpf/custom может быть, у кого-то есть идеи, почему у меня не загружается
Это ошибка, которую я получаю:
$ sudo bpftool prog load bpf/custom/bytecount.o /sys/fs/bpf/tc/globals/bytecounter /sys/fs/bpf/tc/globals/bytecounter_maps
libbpf: Error loading BTF: Invalid argument(22)
libbpf: magic: 0xeb9f
version: 1
flags: 0x0
hdrlen: 24
type_off: 0
type_len: 1164
stroff: 1164
str_len: 1234
btf_total_size: 2422
[1] STRICT (anon) size=32 vlen=4
type typeid=2 bitsoffset=0
key typeid=6 bitsoffset=64
value typeid=9 bitsoffset=126
max_entries type_id=12 bits_offset=192
...
[25] INT unsigned char size=1 bits_offset=0 nr_bits=8 encoding=(none)
[26] FUNC_PROTO (anon) return=3 args=(15 ctx)
[27] FUNC custom_hook type_id=26 vlen != 0
libbpf: Error loading .BTF into kernel: -22. Error: failed to open object file
это последняя часть журнала, спасибо, что напомнили правила по stackflow. [25] INT размер беззнакового символа = 1 бит_смещение = 0 nr_bits = 8 кодирование = (нет) [26] FUNC_PROTO (анон) return = 3 args = (15 ctx) [27] FUNC custom_hook type_id = 26 vlen != 0 libbpf: Ошибка загрузки .BTF в ядро: -22. Ошибка: не удалось открыть объектный файл.
[27] FUNC custom_hook type_id=26 vlen != 0
Кажется, вы столкнулись с этой ошибкой: https://github.com/torvalds/linux/blob/85d33df357b634649ddbe0a20fd2d0fc5732c3cb/kernel/bpf/btf.c#L2655
Стандарт BTF (информация о типе) был обновлен, чтобы начать использовать vlen
для обозначения типа связи функций. Ядро начало поддерживать это после v5.6.
Clang/LLVM также был обновлен (в какой-то момент), чтобы выдавать BTF таким образом, где static=0, global=1, external=2.
В примере в cilium/bpf/custom есть глобальная функция, поэтому проблема возникает из-за сочетания нового компилятора, старого ядра и этого кода. Добавление ключевого слова static
должно исправить это:
__section(STRINGIFY(BPF_CUSTOM_PROG_NAME))
static int custom_hook(const struct __ctx_buff *ctx)
$ sudo bpftool prog load bpf/custom/bytecount.o /sys/fs/bpf/tc/globals/bytecounter /sys/fs/bpf/tc/globals/bytecounter_maps libbpf: failed to find sym for prog bytecount Error: failed to open object file
Исходная проблема решена после добавления «статического», но я все еще не могу открыть файл после его компиляции. $ uname -r 5.4.0-189-generic
приводит ли старая версия ядра к сбою загрузки?
На первом изображении показано начало журнала, волшебство: ожидается 0xeb9f, его значения печати из заголовка BTF, фактическая ошибка, вероятно, находится в нижней части журнала, не могли бы вы поделиться ею? Также, пожалуйста, не делайте скриншоты текста, а просто скопируйте текст в вопрос. Это предпочтительно в Stackoverflow, чтобы текст индексировался.