Код: Выделить всё
libbpf: failed to find valid kernel BTF
libbpf: Error loading vmlinux BTF: -3
libbpf: failed to load object 'execve.bpf.o'
Failed to load eBPF object
- ОС: Ubuntu 22.04. 5 LTS x86_64
- Ядро: 6.8.0-48-generic (обновлено с 5.15.0-125-generic)
< li>Процессор: Intel i9-14900K - выглядит следующим образом:
Код: Выделить всё
neofetchРезультат команды
Я работаю над небольшим проектом eBPF, который отслеживает execve() системные вызовы. Код доступен в моем репозитории GitHub:
https://github.com/KnightChaser/hello-e ... e_tracking
Проект состоит из:
- Makefile: собирает и запускает код.
- execve.bpf.c: код на стороне ядра, который фиксирует выполнение execve().
- execve_user.c : код пользовательского пространства, который взаимодействует с программой eBPF через кольцевой буфер и отображает данные.
- Сгенерирован vmlinux.h:
Код: Выделить всё
sudo apt update sudo apt install linux-headers-$(uname -r) clang llvm libbpf-dev gcc-multilib make bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
- Создал программу:
Код: Выделить всё
make
- Запустил программу:
Это приводит к появлению сообщений об ошибках, упомянутых выше.
Код: Выделить всё
sudo ./execve_user
- Проверенная поддержка BTF ядра: Гарантировано, что ядро скомпилировано с поддержкой BTF.
- Проверено pahole Версия: подтверждено, что pahole — это версия 1.25.
- Установите LIBBPF_LOG_LEVEL= debug: предпринята попытка получить более подробные журналы, но дополнительных результатов не получено.
Код: Выделить всё
LIBBPF_LOG_LEVEL=debug sudo ./execve_user
- Использована strace: Отслежены системные вызовы и замечено, что программа пытается получить доступ к несуществующим объектам. файлы типа /boot/vmlinux-6.8.0-48-generic:
Код: Выделить всё
access("/boot/vmlinux-6.8.0-48-generic", R_OK) = -1 ENOENT (No such file or directory) access("/lib/modules/6.8.0-48-generic/vmlinux-6.8.0-48-generic", R_OK) = -1 ENOENT (No such file or directory) ...
- Напротив, в ядре 5.15.0-125-generic программа не пытается получить доступ к этим файлов и успешно запускается.
- В моей системе установлена двойная загрузка Windows 11 и Ubuntu через grub2win.
- Файл vmlinux.h существует и создан без ошибок.
- Похоже, проблема связана с обновленной версией ядра.
Почему моя программа eBPF не работает с libbpf: не удалось найти действительный BTF ядра после обновления до ядра 6.8.0-48-generic, и как это сделать могу ли я решить эту проблему?
Любая информация о том, почему libbpf не может найти действительный BTF ядра в новом ядре и какие шаги я могу предпринять для решения этой проблемы, будет очень полезна. оценил.
Что я уже пробовал:
- Переустановка заголовков ядра: переустановлены заголовки ядра для новой версии ядра.
- Повторное создание vmlinux.h< /strong>: убедитесь, что vmlinux.h соответствует новому ядру.
- Проверка файлов BTF: проверено, что /sys /kernel/btf/vmlinux существует и доступен.
- Исследование альтернативных местоположений BTF: Замечено, что libbpf ищет файлы BTF в несколько мест, но они не существуют для нового ядра.
Будем очень признательны!
p>
(Примечание: в настоящее время эта проблема рассматривается в выпуске GitHub https://github.com/libbpf/libbpf/issues/863, который я написал вчера. Поскольку репозиторий libbpf на GitHub не так активен, я снова загружаю свой вопрос после уточнения предложений в StackOverflow, где соответствующие разработчики могут быть доступны.)
Подробнее здесь: https://stackoverflow.com/questions/791 ... r-upgradin