On Tue, Aug 13, 2019 at 7:20 AM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote: > > On 8/12/19 8:39 PM, Andrii Nakryiko wrote: > > Make .BTF section allocated and expose its contents through sysfs. > > > > /sys/kernel/btf directory is created to contain all the BTFs present > > inside kernel. Currently there is only kernel's main BTF, represented as > > /sys/kernel/btf/kernel file. Once kernel modules' BTFs are supported, > > each module will expose its BTF as /sys/kernel/btf/<module-name> file. > > > > Current approach relies on a few pieces coming together: > > 1. pahole is used to take almost final vmlinux image (modulo .BTF and > > kallsyms) and generate .BTF section by converting DWARF info into > > BTF. This section is not allocated and not mapped to any segment, > > though, so is not yet accessible from inside kernel at runtime. > > 2. objcopy dumps .BTF contents into binary file and subsequently > > convert binary file into linkable object file with automatically > > generated symbols _binary__btf_kernel_bin_start and > > _binary__btf_kernel_bin_end, pointing to start and end, respectively, > > of BTF raw data. > > 3. final vmlinux image is generated by linking this object file (and > > kallsyms, if necessary). sysfs_btf.c then creates > > /sys/kernel/btf/kernel file and exposes embedded BTF contents through > > it. This allows, e.g., libbpf and bpftool access BTF info at > > well-known location, without resorting to searching for vmlinux image > > on disk (location of which is not standardized and vmlinux image > > might not be even available in some scenarios, e.g., inside qemu > > during testing). > > Small question: given modules will be covered later, would it not be more > obvious to name it /sys/kernel/btf/vmlinux instead? vmlinux totally makes sense, not sure why I didn't think about that initially... I'll follow up with a rename. > > > Alternative approach using .incbin assembler directive to embed BTF > > contents directly was attempted but didn't work, because sysfs_proc.o is > > not re-compiled during link-vmlinux.sh stage. This is required, though, > > to update embedded BTF data (initially empty data is embedded, then > > pahole generates BTF info and we need to regenerate sysfs_btf.o with > > updated contents, but it's too late at that point). > > > > If BTF couldn't be generated due to missing or too old pahole, > > sysfs_btf.c handles that gracefully by detecting that > > _binary__btf_kernel_bin_start (weak symbol) is 0 and not creating > > /sys/kernel/btf at all. > > > > v2->v3: > > - added Documentation/ABI/testing/sysfs-kernel-btf (Greg K-H); > > - created proper kobject (btf_kobj) for btf directory (Greg K-H); > > - undo v2 change of reusing vmlinux, as it causes extra kallsyms pass > > due to initially missing __binary__btf_kernel_bin_{start/end} symbols; > > > > v1->v2: > > - allow kallsyms stage to re-use vmlinux generated by gen_btf(); > > > > Reviewed-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> > > In any case, this is great progress, applied thanks!