I am trying to discover and run a simple eBPF application on a local Linux VM on my Mac M1 laptop. For better efficiency, I chose to run an arm-based Ubuntu on UTM(an opensource VMM).
However, I am having trouble with compiling eBPF elf files. The most common way that I found on various tech blogs to compile is
clang -I headers -O -target bpf -c bpf/xdp.c -o bpf/xdp.elf
Personally, I try to use Mac clang to cross compile with target bpf-linux-eabi, but seems like the clang in Mac does not support this kind of target
error: unable to create target: 'No available targets are compatible with triple "bpf-unknown-linux-eabi"'
And clang -print-targets shows that
Registered Targets:
aarch64 - AArch64 (little endian)
aarch64_32 - AArch64 (little endian ILP32)
aarch64_be - AArch64 (big endian)
arm - ARM
arm64 - ARM64 (little endian)
arm64_32 - ARM64 (little endian ILP32)
armeb - ARM (big endian)
thumb - Thumb
thumbeb - Thumb (big endian)
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
Obviously no bpf target found. BTW The clang version of Mac Ventura is 14.0.
I also tried to find a Docker clang image, only linux/amd64 versions are available(I need linux/arm64).
Anyone help to figure out how to cross compile elf files on Mac? Either by Mac clang or docker clang. Thank you in advance.
When clang is compiled you can chose which targets are included or not. Your distro likely compiled clang without BPF support so you might have to manually compile clang instead.
Here is the getting started page which instructions on how to do so https://clang.llvm.org/get_started.html
There are a bunch of knobs during compilation the important ones found here especially important in your case is to make sure
BPFis included inLLVM_TARGETS_TO_BUILDwhich controls this list of compiled in target platforms.