libbpf: Support target-less SEC() definitions for BTF-backed programs
authorAndrii Nakryiko <andrii@kernel.org>
Thu, 28 Apr 2022 18:53:48 +0000 (11:53 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 28 Apr 2022 21:46:04 +0000 (23:46 +0200)
Similar to previous patch, support target-less definitions like
SEC("fentry"), SEC("freplace"), etc. For such BTF-backed program types
it is expected that user will specify BTF target programmatically at
runtime using bpf_program__set_attach_target() *before* load phase. If
not, libbpf will report this as an error.

Aslo use SEC_ATTACH_BTF flag instead of explicitly listing a set of
types that are expected to require attach_btf_id. This was an accidental
omission during custom SEC() support refactoring.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20220428185349.3799599-3-andrii@kernel.org
tools/lib/bpf/libbpf.c

index e840e48d3a76d4c29a8f3ea36dff7cf089219953..c9aa5b1278fc2a1e4d7443c1af656fb34bd1f85e 100644 (file)
@@ -6682,17 +6682,32 @@ static int libbpf_prepare_prog_load(struct bpf_program *prog,
        if (prog->type == BPF_PROG_TYPE_XDP && (def & SEC_XDP_FRAGS))
                opts->prog_flags |= BPF_F_XDP_HAS_FRAGS;
 
-       if (def & SEC_DEPRECATED)
+       if (def & SEC_DEPRECATED) {
                pr_warn("SEC(\"%s\") is deprecated, please see https://github.com/libbpf/libbpf/wiki/Libbpf-1.0-migration-guide#bpf-program-sec-annotation-deprecations for details\n",
                        prog->sec_name);
+       }
 
-       if ((prog->type == BPF_PROG_TYPE_TRACING ||
-            prog->type == BPF_PROG_TYPE_LSM ||
-            prog->type == BPF_PROG_TYPE_EXT) && !prog->attach_btf_id) {
+       if ((def & SEC_ATTACH_BTF) && !prog->attach_btf_id) {
                int btf_obj_fd = 0, btf_type_id = 0, err;
                const char *attach_name;
 
-               attach_name = strchr(prog->sec_name, '/') + 1;
+               attach_name = strchr(prog->sec_name, '/');
+               if (!attach_name) {
+                       /* if BPF program is annotated with just SEC("fentry")
+                        * (or similar) without declaratively specifying
+                        * target, then it is expected that target will be
+                        * specified with bpf_program__set_attach_target() at
+                        * runtime before BPF object load step. If not, then
+                        * there is nothing to load into the kernel as BPF
+                        * verifier won't be able to validate BPF program
+                        * correctness anyways.
+                        */
+                       pr_warn("prog '%s': no BTF-based attach target is specified, use bpf_program__set_attach_target()\n",
+                               prog->name);
+                       return -EINVAL;
+               }
+               attach_name++; /* skip over / */
+
                err = libbpf_find_attach_btf_id(prog, attach_name, &btf_obj_fd, &btf_type_id);
                if (err)
                        return err;
@@ -8869,18 +8884,18 @@ static const struct bpf_sec_def section_defs[] = {
        SEC_DEF("raw_tp+",              RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp),
        SEC_DEF("raw_tracepoint.w+",    RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp),
        SEC_DEF("raw_tp.w+",            RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp),
-       SEC_DEF("tp_btf/",              TRACING, BPF_TRACE_RAW_TP, SEC_ATTACH_BTF, attach_trace),
-       SEC_DEF("fentry/",              TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF, attach_trace),
-       SEC_DEF("fmod_ret/",            TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF, attach_trace),
-       SEC_DEF("fexit/",               TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF, attach_trace),
-       SEC_DEF("fentry.s/",            TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
-       SEC_DEF("fmod_ret.s/",          TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
-       SEC_DEF("fexit.s/",             TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
-       SEC_DEF("freplace/",            EXT, 0, SEC_ATTACH_BTF, attach_trace),
-       SEC_DEF("lsm/",                 LSM, BPF_LSM_MAC, SEC_ATTACH_BTF, attach_lsm),
-       SEC_DEF("lsm.s/",               LSM, BPF_LSM_MAC, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_lsm),
-       SEC_DEF("iter/",                TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF, attach_iter),
-       SEC_DEF("iter.s/",              TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_iter),
+       SEC_DEF("tp_btf+",              TRACING, BPF_TRACE_RAW_TP, SEC_ATTACH_BTF, attach_trace),
+       SEC_DEF("fentry+",              TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF, attach_trace),
+       SEC_DEF("fmod_ret+",            TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF, attach_trace),
+       SEC_DEF("fexit+",               TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF, attach_trace),
+       SEC_DEF("fentry.s+",            TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
+       SEC_DEF("fmod_ret.s+",          TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
+       SEC_DEF("fexit.s+",             TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
+       SEC_DEF("freplace+",            EXT, 0, SEC_ATTACH_BTF, attach_trace),
+       SEC_DEF("lsm+",                 LSM, BPF_LSM_MAC, SEC_ATTACH_BTF, attach_lsm),
+       SEC_DEF("lsm.s+",               LSM, BPF_LSM_MAC, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_lsm),
+       SEC_DEF("iter+",                TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF, attach_iter),
+       SEC_DEF("iter.s+",              TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_iter),
        SEC_DEF("syscall",              SYSCALL, 0, SEC_SLEEPABLE),
        SEC_DEF("xdp.frags/devmap",     XDP, BPF_XDP_DEVMAP, SEC_XDP_FRAGS),
        SEC_DEF("xdp/devmap",           XDP, BPF_XDP_DEVMAP, SEC_ATTACHABLE),