selftests/bpf: Adding test for attach id vs prototype mismatch

Adding hack into libbpf so we resolve function into BTF id
specified by KRAVA variable.

Getting trace output from bpf program attached to bpf_test_func:

      test_progs-684     [001] ...11    99.660596: bpf_trace_printk: KRAVA 0000000000000001 0000000000000000

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 27d9faa..4f7f47c 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -9100,6 +9100,16 @@ static int find_kernel_btf_id(struct bpf_object *obj, const char *attach_name,
 {
 	int ret, i;
 
+	if (!strcmp(attach_name, "bpf_test_func")) {
+		char *str = getenv("KRAVA");
+		if (!str)
+			return -ESRCH;
+		*btf_obj_fd = 0; /* vmlinux BTF */
+		*btf_type_id = atoi(str);
+		fprintf(stderr, "KRAVA btf_id %u\n", *btf_type_id);
+		return 0;
+	}
+
 	ret = find_attach_btf_id(obj->btf_vmlinux, attach_name, attach_type);
 	if (ret > 0) {
 		*btf_obj_fd = 0; /* vmlinux BTF */
diff --git a/tools/testing/selftests/bpf/prog_tests/krava.c b/tools/testing/selftests/bpf/prog_tests/krava.c
new file mode 100644
index 0000000..e7a76f5
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/krava.c
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <test_progs.h>
+#include "krava.skel.h"
+
+void test_krava(void)
+{
+	LIBBPF_OPTS(bpf_prog_load_opts, trace_opts,
+		.expected_attach_type = BPF_TRACE_FENTRY,
+	);
+	LIBBPF_OPTS(bpf_test_run_opts, topts);
+	struct krava *skel = NULL;
+	int err, prog_fd;
+
+	skel = krava__open();
+	if (!ASSERT_OK_PTR(skel, "krava__open"))
+		return;
+
+	err = krava__load(skel);
+	if (!ASSERT_OK(err, "krava__load"))
+		goto cleanup;
+
+	err = krava__attach(skel);
+	if (!ASSERT_OK(err, "krava__attach"))
+		goto cleanup;
+
+	prog_fd = bpf_program__fd(skel->progs.prog);
+	err = bpf_prog_test_run_opts(prog_fd, &topts);
+	ASSERT_OK(err, "test_run");
+	ASSERT_EQ(topts.retval, 0, "test_run");
+
+cleanup:
+	krava__destroy(skel);
+}
diff --git a/tools/testing/selftests/bpf/progs/krava.c b/tools/testing/selftests/bpf/progs/krava.c
new file mode 100644
index 0000000..c311adb
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/krava.c
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include "vmlinux.h"
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+SEC("fentry/bpf_test_func")
+int BPF_PROG(prog, struct bpf_prog *prog)
+{
+	bpf_printk("KRAVA %p %p\n", prog, prog->aux);
+	return 0;
+}
+
+char _license[] SEC("license") = "GPL";