mirror of
https://github.com/netdata/libbpf.git
synced 2026-03-18 15:29:06 +08:00
Arch recently added BTF to their distribution kernels - see https://bugs.archlinux.org/task/66260 Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
130 lines
5.6 KiB
Markdown
130 lines
5.6 KiB
Markdown
|
||
This is a mirror of [bpf-next linux tree](https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next)'s
|
||
`tools/lib/bpf` directory plus its supporting header files.
|
||
|
||
The following files will by sync'ed with bpf-next repo:
|
||
- `src/` <-> `bpf-next/tools/lib/bpf/`
|
||
- `include/uapi/linux/bpf_common.h` <-> `bpf-next/tools/include/uapi/linux/bpf_common.h`
|
||
- `include/uapi/linux/bpf.h` <-> `bpf-next/tools/include/uapi/linux/bpf.h`
|
||
- `include/uapi/linux/btf.h` <-> `bpf-next/tools/include/uapi/linux/btf.h`
|
||
- `include/uapi/linux/if_link.h` <-> `bpf-next/tools/include/uapi/linux/if_link.h`
|
||
- `include/uapi/linux/if_xdp.h` <-> `bpf-next/tools/include/uapi/linux/if_xdp.h`
|
||
- `include/uapi/linux/netlink.h` <-> `bpf-next/tools/include/uapi/linux/netlink.h`
|
||
- `include/tools/libc_compat.h` <-> `bpf-next/tools/include/tools/libc_compat.h`
|
||
|
||
Other header files at this repo (`include/linux/*.h`) are reduced versions of
|
||
their counterpart files at bpf-next's `tools/include/linux/*.h` to make compilation
|
||
successful.
|
||
|
||
Build
|
||
[](https://travis-ci.org/libbpf/libbpf)
|
||
[](https://lgtm.com/projects/g/libbpf/libbpf/alerts/)
|
||
[](https://scan.coverity.com/projects/libbpf)
|
||
=====
|
||
libelf is an internal dependency of libbpf and thus it is required to link
|
||
against and must be installed on the system for applications to work.
|
||
pkg-config is used by default to find libelf, and the program called can be
|
||
overridden with `PKG_CONFIG`.
|
||
If using `pkg-config` at build time is not desired, it can be disabled by setting
|
||
`NO_PKG_CONFIG=1` when calling make.
|
||
|
||
To build both static libbpf.a and shared libbpf.so:
|
||
```bash
|
||
$ cd src
|
||
$ make
|
||
```
|
||
|
||
To build only static libbpf.a library in directory
|
||
build/ and install them together with libbpf headers in a staging directory
|
||
root/:
|
||
```bash
|
||
$ cd src
|
||
$ mkdir build root
|
||
$ BUILD_STATIC_ONLY=y OBJDIR=build DESTDIR=root make install
|
||
```
|
||
|
||
To build both static libbpf.a and shared libbpf.so against a custom libelf
|
||
dependency installed in /build/root/ and install them together with libbpf
|
||
headers in a build directory /build/root/:
|
||
```bash
|
||
$ cd src
|
||
$ PKG_CONFIG_PATH=/build/root/lib64/pkgconfig DESTDIR=/build/root make install
|
||
```
|
||
|
||
Distributions
|
||
=============
|
||
|
||
Distributions packaging libbpf from this mirror:
|
||
- [Fedora](https://src.fedoraproject.org/rpms/libbpf)
|
||
- [Gentoo](https://packages.gentoo.org/packages/dev-libs/libbpf)
|
||
- [Debian](https://packages.debian.org/sid/libbpf-dev)
|
||
|
||
Benefits of packaging from the mirror over packaging from kernel sources:
|
||
- Consistent versioning across distributions.
|
||
- No ties to any specific kernel, transparent handling of older kernels.
|
||
Libbpf is designed to be kernel-agnostic and work across multitude of kernel
|
||
versions. It has built-in mechanisms to gracefully handle older kernels,
|
||
that are missing some of the features, by working around or gracefully
|
||
degrading functionality. Thus libbpf is not tied to a specific kernel
|
||
version and can/should be packaged and versioned independently.
|
||
- Continuous integration testing via [TravisCI](https://travis-ci.org/libbpf/libbpf).
|
||
- Static code analysis via [LGTM](https://lgtm.com/projects/g/libbpf/libbpf) and [Coverity](https://scan.coverity.com/projects/libbpf).
|
||
|
||
Package dependencies of libbpf, package names may vary across distros:
|
||
- zlib
|
||
- libelf
|
||
|
||
BPF CO-RE (Compile Once – Run Everywhere)
|
||
=========================================
|
||
|
||
Libbpf supports building BPF CO-RE-enabled applications, which, in contrast to
|
||
[BCC](https://github.com/iovisor/bcc/), do not require Clang/LLVM runtime
|
||
being deployed to target servers and doesn't rely on kernel-devel headers
|
||
being available.
|
||
|
||
It does rely on kernel to be built with [BTF type
|
||
information](https://www.kernel.org/doc/html/latest/bpf/btf.html), though.
|
||
Some major Linux distributions come with kernel BTF already built in:
|
||
- Fedora 31+
|
||
- RHEL 8.2+
|
||
- OpenSUSE Tumbleweed (in the next release, as of 2020-06-04)
|
||
- Arch Linux (from kernel 5.7.1.arch1-1)
|
||
|
||
If your kernel doesn't come with BTF built-in, you'll need to build custom
|
||
kernel. You'll need:
|
||
- `pahole` 1.16+ tool (part of `dwarves` package), which performs DWARF to
|
||
BTF conversion;
|
||
- kernel built with `CONFIG_DEBUG_INFO_BTF=y` option;
|
||
- you can check if your kernel has BTF built-in by looking for
|
||
`/sys/kernel/btf/vmlinux` file:
|
||
|
||
```shell
|
||
$ ls -la /sys/kernel/btf/vmlinux
|
||
-r--r--r--. 1 root root 3541561 Jun 2 18:16 /sys/kernel/btf/vmlinux
|
||
```
|
||
|
||
To develop and build BPF programs, you'll need Clang/LLVM 10+. The following
|
||
distributions have Clang/LLVM 10+ packaged by default:
|
||
- Fedora 32+
|
||
- Ubuntu 20.04+
|
||
- Arch Linux
|
||
|
||
Otherwise, please make sure to update it on your system.
|
||
|
||
The following resources are useful to understand what BPF CO-RE is and how to
|
||
use it:
|
||
- [BPF Portability and CO-RE](https://facebookmicrosites.github.io/bpf/blog/2020/02/19/bpf-portability-and-co-re.html)
|
||
- [HOWTO: BCC to libbpf conversion](https://facebookmicrosites.github.io/bpf/blog/2020/02/20/bcc-to-libbpf-howto-guide.html)
|
||
- [libbpf-tools in BCC repo](https://github.com/iovisor/bcc/tree/master/libbpf-tools)
|
||
contain lots of real-world tools converted from BCC to BPF CO-RE. Consider
|
||
converting some more to both contribute to the BPF community and gain some
|
||
more experience with it.
|
||
|
||
License
|
||
=======
|
||
|
||
This work is dual-licensed under BSD 2-clause license and GNU LGPL v2.1 license.
|
||
You can choose between one of them if you use this work.
|
||
|
||
`SPDX-License-Identifier: BSD-2-Clause OR LGPL-2.1`
|