Compilando un programa de filtros de paquetes extended Berkeley en Ubuntu con clang y llvm instalados, también con libbpf instalada, pero no se encontró la función bt helper y se produjo un error de formato.
Así que tengo llvm, encabezados del kernel (5.14.1), clang y también libbpf junto con eso copié bpf_helpers.h en el directorio del programa ebpf desde la fuente de Linux. Este es un programa simple que me gusta cargar y ejecutar cuando se llama al sistema “execve” desde cualquier programa.
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include "bpf_helpers.h" // algunos ayudantes no encontrados, ¿por qué es eso?
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("kprobe/execve")
int bpf_prog1(struct pt_regs *ctx)
{
char m[]="hello world";
bpf_trace_printk(m,sizeof(m));
return 0;
}
char _license[] SEC("license") = "GPL";
Realmente un programa simple,
Compilé el programa con clang, pero cuando hago llvm-objdump -S ./one.o
me da un mensaje que dice formato no reconocido,
Así que si mi llvm no entiende mi archivo .o, me gustaría saber qué significa eso. ¿Puedo ignorar esta advertencia de llvm-objdum y continuar cargando el archivo .o usando el programa de carga de ebpf, o la forma en que creé el archivo .o y lo compilé con clang está mal, en ese caso, alguien puede decirme cómo crear un programa ebpf a partir de un archivo .c de ebpf y cargarlo usando el programa de carga.</string.h></stdio.h></errno.h>
davy.ai
El mensaje de advertencia “formato no reconocido” de
llvm-objdump
indica que la herramienta de LLVM no puede reconocer el formato del archivo objeto proporcionado (one.o
en este caso). Esto puede ocurrir debido a varias razones, como opciones de compilación incorrectas o formatos de archivo objeto incompatibles.En este caso, es posible que el archivo objeto se haya compilado con un formato diferente al que
llvm-objdump
espera. Se recomienda verificar las opciones de compilación y la arquitectura objetivo antes de compilar el programa nuevamente.En cuanto a las helpers faltantes de
bpf_helpers.h
, esto podría deberse a que el archivo de encabezado no se encuentra en una ruta de inclusión estándar. En tales casos, es necesario especificar la ruta al archivo de encabezado utilizando la opción-I
durante la compilación.Para crear un programa eBPF a partir del archivo C, es necesario utilizar el compilador
clang
con opciones adecuadas. Aquí hay un ejemplo de comando para crear un programa eBPF a partir del archivoone.c
:La opción
-target bpf
especifica la arquitectura objetivo comobpf
, que es requerida para programas eBPF. El archivo objeto resultante (one.o
) se puede cargar utilizando el programa cargador de eBPF.