• Alexei Starovoitov's avatar
    bpftool: Use syscall/loader program in "prog load" and "gen skeleton" command. · d510296d
    Alexei Starovoitov authored
    Add -L flag to bpftool to use libbpf gen_trace facility and syscall/loader program
    for skeleton generation and program loading.
    
    "bpftool gen skeleton -L" command will generate a "light skeleton" or "loader skeleton"
    that is similar to existing skeleton, but has one major difference:
    $ bpftool gen skeleton lsm.o > lsm.skel.h
    $ bpftool gen skeleton -L lsm.o > lsm.lskel.h
    $ diff lsm.skel.h lsm.lskel.h
    @@ -5,34 +4,34 @@
     #define __LSM_SKEL_H__
    
     #include <stdlib.h>
    -#include <bpf/libbpf.h>
    +#include <bpf/bpf.h>
    
    The light skeleton does not use majority of libbpf infrastructure.
    It doesn't need libelf. It doesn't parse .o file.
    It only needs few sys_bpf wrappers. All of them are in bpf/bpf.h file.
    In future libbpf/bpf.c can be inlined into bpf.h, so not even libbpf.a would be
    needed to work with light skeleton.
    
    "bpftool prog load -L file.o" command is introduced for debugging of syscall/loader
    program generation. Just like the same command without -L it will try to load
    the programs from file.o into the kernel. It won't even try to pin them.
    
    "bpftool prog load -L -d file.o" command will provide additional debug messages
    on how syscall/loader program was generated.
    Also the execution of syscall/loader program will use bpf_trace_printk() for
    each step of loading BTF, creating maps, and loading programs.
    The user can do "cat /.../trace_pipe" for further debug.
    
    An example of fexit_sleep.lskel.h generated from progs/fexit_sleep.c:
    struct fexit_sleep {
    	struct bpf_loader_ctx ctx;
    	struct {
    		struct bpf_map_desc bss;
    	} maps;
    	struct {
    		struct bpf_prog_desc nanosleep_fentry;
    		struct bpf_prog_desc nanosleep_fexit;
    	} progs;
    	struct {
    		int nanosleep_fentry_fd;
    		int nanosleep_fexit_fd;
    	} links;
    	struct fexit_sleep__bss {
    		int pid;
    		int fentry_cnt;
    		int fexit_cnt;
    	} *bss;
    };
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20210514003623.28033-18-alexei.starovoitov@gmail.com
    d510296d
gen.c 23.5 KB