Chapter 4. eBPF Complexity
You’ve now seen an example of eBPF programming to give you a flavor of how it works. While basic examples can make eBPF seem relatively straightforward, there are some complexities that make it challenging.
One area that has historically made it relatively difficult to write and distribute eBPF programs is kernel compatibility.
Portability Across Kernels
eBPF programs can access kernel data structures, and these may change across different kernel versions. The structures themselves are defined in header files that form part of the Linux source code. Back in the day, you had to compile your eBPF programs against the correct set of header files compatible with the kernel where you want to run those programs.
BCC Approach to Portability
To address portability across kernels, the BCC1 (BPF Compiler Collection) project took the approach of compiling eBPF code at runtime, in situ on the destination machine. This means the compilation toolchain needs to be installed onto every destination machine where you want the code to run,2 and you have to wait for the compilation to complete before the tool starts. You also have to hope that the kernel headers are present on the filesystem (and that’s not always the case). Enter BPF CO-RE.
CO-RE
The CO-RE—compile once, run everywhere—approach consists of a few elements:
- BTF (BPF Type Format)
This is a format for expressing the layout of data structures and function signatures. Modern Linux kernels support BTF, ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access