Libbpf v1.4.0 has been released ([0]). Another 4 months of libbpf development has passed. On libbpf's user space side, we added support for some brand new BPF features (BPF token, BPF arena maps, BPF cookies for raw tracepoints). A big chunk of changes happened around struct_ops usability (kernel module support) and handling backwards compatibility aspects using BPF CO-RE principles (see notes below for details). Libbpf is now also more helpful in its error messages when attempting to use BPF maps/programs that were not auto-loaded/auto-created. On BPF-side functionality, one major feature is support for annotating BPF global subprogram arguments, making global subprogs usable and useful in wider and more complicated scenarios. Helpfully, `__arg_ctx` (for marking passed-in context argument) functionality is supported even on old kernels that don't support `__arg_ctx` annotation natively, thanks to (transparent) libbpf-only type rewriting logic. This applies to kprobe/uprobe and perf_event programs, only. Other program types require kernel-side support, unfortunately. See all the `__arg_xxx` annotations added for full set of annotations supported. Among other BPF-side additions are BPF arena-mapped global variables support, significantly improving usability of BPF arena for fixed-sized data sets. And the `bpf_core_cast()` macro was added to make the usage of `bpf_rdonly_cast()` helper simpler in real programs. There were also important additions to make libbpf work better with the GCC-BPF compiler (mostly BPF CO-RE helpers). Last but not least, a bunch of important bug fixes were applied, making libbpf work better on Android systems, improving handling of corrupt ELF files and various other edge cases. Thanks to everyone contributing fixes, features, code reviews, as well as feature requests and bug reports! [0] https://github.com/libbpf/libbpf/releases/tag/v1.4.0 [1] Full Changelog: https://github.com/libbpf/libbpf/compare/v1.3.0...v1.4.0 -- Andrii