CFLAGS += -g -O0 -rdynamic -Wall $(GENFLAGS) $(SAN_CFLAGS)             \
          -I$(CURDIR) -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR)          \
          -I$(TOOLSINCDIR) -I$(APIDIR) -I$(OUTPUT)                      \
-         -Dbpf_prog_load_deprecated=bpf_prog_test_load                 \
          -Dbpf_load_program=bpf_test_load_program
 LDLIBS += -lcap -lelf -lz -lrt -lpthread
 
 $(OUTPUT)/xdping: testing_helpers.o
 $(OUTPUT)/flow_dissector_load: testing_helpers.o
 $(OUTPUT)/test_maps: testing_helpers.o
+$(OUTPUT)/test_verifier: testing_helpers.o
 
 BPFTOOL ?= $(DEFAULT_BPFTOOL)
 $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile)    \
 
 
 #include <bpf/bpf.h>
 #include <bpf/libbpf.h>
+#include "testing_helpers.h"
 
 static inline int bpf_flow_load(struct bpf_object **obj,
                                const char *path,
        int prog_array_fd;
        int ret, fd, i;
 
-       ret = bpf_prog_load(path, BPF_PROG_TYPE_FLOW_DISSECTOR, obj,
+       ret = bpf_prog_test_load(path, BPF_PROG_TYPE_FLOW_DISSECTOR, obj,
                            prog_fd);
        if (ret)
                return ret;
 
 #include <bpf/libbpf.h>
 
 #include "cgroup_helpers.h"
+#include "testing_helpers.h"
 #include "bpf_rlimit.h"
 
 #define CHECK(condition, tag, format...) ({            \
        if (CHECK(cgroup_fd < 0, "cgroup_setup_and_join", "err %d errno %d\n", cgroup_fd, errno))
                return 1;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
-       if (CHECK(err, "bpf_prog_load", "err %d errno %d\n", err, errno))
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
+       if (CHECK(err, "bpf_prog_test_load", "err %d errno %d\n", err, errno))
                goto cleanup_cgroup_env;
 
        cgidmap_fd = bpf_find_map(__func__, obj, "cg_ids");
 
        bzero(zeros, sizeof(zeros));
        for (i = 0; i < nr_iters; i++) {
                now = time(NULL);
-               err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT,
+               err = bpf_prog_test_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT,
                                    &objs[i], &prog_fds[i]);
                /* test_obj_id.o is a dumb prog. It should never fail
                 * to load.
 
        int err, tgt_fd, i;
        struct btf *btf;
 
-       err = bpf_prog_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
+       err = bpf_prog_test_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
                            &tgt_obj, &tgt_fd);
        if (!ASSERT_OK(err, "tgt_prog_load"))
                return;
        if (CHECK(!prog, "find_prog", "prog %s not found\n", prog_name))
                return -ENOENT;
 
-       err = bpf_prog_load(tgt_obj_file, BPF_PROG_TYPE_UNSPEC,
+       err = bpf_prog_test_load(tgt_obj_file, BPF_PROG_TYPE_UNSPEC,
                            &tgt_obj, &tgt_fd);
        if (CHECK(err, "second_prog_load", "file %s err %d errno %d\n",
                  tgt_obj_file, err, errno))
        __u32 duration = 0;
        int err, pkt_fd, attach_prog_fd;
 
-       err = bpf_prog_load(tgt_name, BPF_PROG_TYPE_UNSPEC,
+       err = bpf_prog_test_load(tgt_name, BPF_PROG_TYPE_UNSPEC,
                            &pkt_obj, &pkt_fd);
        /* the target prog should load fine */
        if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n",
        int err, pkt_fd;
        __u32 duration = 0;
 
-       err = bpf_prog_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
+       err = bpf_prog_test_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
                            &pkt_obj, &pkt_fd);
        /* the target prog should load fine */
        if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n",
 
        struct bpf_map *map;
        cpu_set_t cpu_set;
 
-       err = bpf_prog_load(file_err, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
+       err = bpf_prog_test_load(file_err, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
        if (CHECK(err >= 0, "prog_load raw tp", "err %d errno %d\n", err, errno))
                return;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
        if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
                return;
 
 
        struct bpf_object *obj;
        int err, prog_fd;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
        if (CHECK(err, "load program", "error %d loading %s\n", err, file))
                return;
 
 
        struct bpf_object *obj;
        int err, prog_fd;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
        if (CHECK(err, "load program", "error %d loading %s\n", err, file))
                return;
 
 
        const int zero = 0;
        bool test_ok[2];
 
-       err = bpf_prog_load("./test_pkt_access.o", BPF_PROG_TYPE_SCHED_CLS,
+       err = bpf_prog_test_load("./test_pkt_access.o", BPF_PROG_TYPE_SCHED_CLS,
                            &obj, &tattr.prog_fd);
        if (CHECK(err, "prog_load sched cls", "err %d errno %d\n", err, errno))
                return;
 
        char buf[128];
        u32 *magic = (u32 *)buf;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
 
        if (CHECK_FAIL(server_fd < 0))
                goto close_cgroup_fd;
 
-       err = bpf_prog_load("./load_bytes_relative.o", BPF_PROG_TYPE_CGROUP_SKB,
+       err = bpf_prog_test_load("./load_bytes_relative.o", BPF_PROG_TYPE_CGROUP_SKB,
                            &obj, &prog_fd);
        if (CHECK_FAIL(err))
                goto close_server_fd;
 
        int err = 0, key = 0, i;
        void *ret;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
        if (CHECK_FAIL(err)) {
-               printf("test_map_lock:bpf_prog_load errno %d\n", errno);
+               printf("test_map_lock:bpf_prog_test_load errno %d\n", errno);
                goto close_prog;
        }
        map_fd[0] = bpf_find_map(__func__, obj, "hash_map");
 
        __u32 duration, retval;
        int err, prog_fd;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
 
        __u32 duration, retval;
        int err, prog_fd;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
 
        else
                return;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
 
        int err;
        int i;
 
-       err = bpf_prog_load("./test_skb_ctx.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+       err = bpf_prog_test_load("./test_skb_ctx.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
                            &tattr.prog_fd);
        if (CHECK_ATTR(err, "load", "err %d errno %d\n", err, errno))
                return;
 
        struct bpf_object *obj;
        int err;
 
-       err = bpf_prog_load("./test_skb_helpers.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+       err = bpf_prog_test_load("./test_skb_helpers.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
                            &tattr.prog_fd);
        if (CHECK_ATTR(err, "load", "err %d errno %d\n", err, errno))
                return;
 
        int err = 0, i;
        void *ret;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
        if (CHECK_FAIL(err)) {
-               printf("test_spin_lock:bpf_prog_load errno %d\n", errno);
+               printf("test_spin_lock:bpf_prog_test_load errno %d\n", errno);
                goto close_prog;
        }
        for (i = 0; i < 4; i++)
 
        struct bpf_object *obj;
        struct bpf_link *link;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
        if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
                return;
 
 
        struct bpf_object *obj;
        struct bpf_link *link = NULL;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
        if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
                return;
 
 
        char prog_name[32];
        char buff[128] = {};
 
-       err = bpf_prog_load("tailcall1.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+       err = bpf_prog_test_load("tailcall1.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
                            &prog_fd);
        if (CHECK_FAIL(err))
                return;
        char prog_name[32];
        char buff[128] = {};
 
-       err = bpf_prog_load("tailcall2.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+       err = bpf_prog_test_load("tailcall2.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
                            &prog_fd);
        if (CHECK_FAIL(err))
                return;
        __u32 retval, duration;
        char buff[128] = {};
 
-       err = bpf_prog_load(which, BPF_PROG_TYPE_SCHED_CLS, &obj,
+       err = bpf_prog_test_load(which, BPF_PROG_TYPE_SCHED_CLS, &obj,
                            &prog_fd);
        if (CHECK_FAIL(err))
                return;
        char buff[128] = {};
        char prog_name[32];
 
-       err = bpf_prog_load("tailcall4.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+       err = bpf_prog_test_load("tailcall4.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
                            &prog_fd);
        if (CHECK_FAIL(err))
                return;
        char buff[128] = {};
        char prog_name[32];
 
-       err = bpf_prog_load("tailcall5.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+       err = bpf_prog_test_load("tailcall5.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
                            &prog_fd);
        if (CHECK_FAIL(err))
                return;
        __u32 retval, duration;
        char prog_name[32];
 
-       err = bpf_prog_load("tailcall_bpf2bpf1.o", BPF_PROG_TYPE_SCHED_CLS,
+       err = bpf_prog_test_load("tailcall_bpf2bpf1.o", BPF_PROG_TYPE_SCHED_CLS,
                            &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
        __u32 retval, duration;
        char buff[128] = {};
 
-       err = bpf_prog_load("tailcall_bpf2bpf2.o", BPF_PROG_TYPE_SCHED_CLS,
+       err = bpf_prog_test_load("tailcall_bpf2bpf2.o", BPF_PROG_TYPE_SCHED_CLS,
                            &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
        __u32 retval, duration;
        char prog_name[32];
 
-       err = bpf_prog_load("tailcall_bpf2bpf3.o", BPF_PROG_TYPE_SCHED_CLS,
+       err = bpf_prog_test_load("tailcall_bpf2bpf3.o", BPF_PROG_TYPE_SCHED_CLS,
                            &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
        __u32 retval, duration;
        char prog_name[32];
 
-       err = bpf_prog_load("tailcall_bpf2bpf4.o", BPF_PROG_TYPE_SCHED_CLS,
+       err = bpf_prog_test_load("tailcall_bpf2bpf4.o", BPF_PROG_TYPE_SCHED_CLS,
                            &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
        __u32 duration = 0;
        char buf[256];
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
        if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
                return;
 
 
        __u32 duration = 0;
        char buf[256];
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
-       if (CHECK(err, "bpf_prog_load", "err %d errno %d\n", err, errno))
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
+       if (CHECK(err, "bpf_prog_test_load", "err %d errno %d\n", err, errno))
                goto close_prog;
 
        snprintf(buf, sizeof(buf),
 
        struct bpf_object *obj;
        __u32 duration = 0;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
        CHECK(err, "", "err %d errno %d\n", err, errno);
        if (err)
                return;
 
 
        query = malloc(sizeof(*query) + sizeof(__u32) * num_progs);
        for (i = 0; i < num_progs; i++) {
-               err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj[i],
+               err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj[i],
                                    &prog_fd[i]);
                if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
                        goto cleanup1;
 
        __u32 duration, retval, size;
        int err, prog_fd, map_fd;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
 
        int err, prog_fd;
        char buf[128];
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
        __u32 duration, retval, size, expect_sz;
        int err, prog_fd;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
                .data_size_out  = 0, /* Per test */
        };
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &tattr.prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &tattr.prog_fd);
        if (CHECK_ATTR(err, "load", "err %d errno %d\n", err, errno))
                return;
 
 
 
        len = sizeof(info);
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj1, &fd1);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj1, &fd1);
        if (CHECK_FAIL(err))
                return;
        err = bpf_obj_get_info_by_fd(fd1, &info, &len);
                goto out_1;
        id1 = info.id;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj2, &fd2);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj2, &fd2);
        if (CHECK_FAIL(err))
                goto out_1;
 
                goto out_2;
        id2 = info.id;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj3, &fd3);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj3, &fd3);
        if (CHECK_FAIL(err))
                goto out_2;
 
 
 
        /* Setup prog */
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
 
        char in[128], out[128];
        int err, prog_fd;
 
-       err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
+       err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
 
                              __builtin_preserve_access_index(&skb->len));
 
        ret = ctx->ret;
-       /* bpf_prog_load() loads "test_pkt_access.o" with BPF_F_TEST_RND_HI32
+       /* bpf_prog_test_load() loads "test_pkt_access.o" with BPF_F_TEST_RND_HI32
         * which randomizes upper 32 bits after BPF_ALU32 insns.
         * Hence after 'w0 <<= 1' upper bits of $rax are random.
         * That is expected and correct. Trim them.
 
 #include <bpf/libbpf.h>
 
 #include "cgroup_helpers.h"
+#include "testing_helpers.h"
 #include "bpf_rlimit.h"
 
 #define DEV_CGROUP_PROG "./dev_cgroup.o"
        int prog_fd, cgroup_fd;
        __u32 prog_cnt;
 
-       if (bpf_prog_load(DEV_CGROUP_PROG, BPF_PROG_TYPE_CGROUP_DEVICE,
+       if (bpf_prog_test_load(DEV_CGROUP_PROG, BPF_PROG_TYPE_CGROUP_DEVICE,
                          &obj, &prog_fd)) {
                printf("Failed to load DEV_CGROUP program\n");
                goto out;
 
 #include <bpf/bpf.h>
 #include <bpf/libbpf.h>
 
+#include "testing_helpers.h"
+
 int main(int argc, char **argv)
 {
        struct bpf_object *obj;
                return 2;
        }
 
-       ret = bpf_prog_load("test_lirc_mode2_kern.o",
-                           BPF_PROG_TYPE_LIRC_MODE2, &obj, &progfd);
+       ret = bpf_prog_test_load("test_lirc_mode2_kern.o",
+                                BPF_PROG_TYPE_LIRC_MODE2, &obj, &progfd);
        if (ret) {
                printf("Failed to load bpf program\n");
                return 1;
 
 #include "bpf_util.h"
 #include "bpf_rlimit.h"
 #include "test_maps.h"
+#include "testing_helpers.h"
 
 #ifndef ENOTSUPP
 #define ENOTSUPP 524
        }
 
        /* Load SK_SKB program and Attach */
-       err = bpf_prog_load(SOCKMAP_PARSE_PROG,
+       err = bpf_prog_test_load(SOCKMAP_PARSE_PROG,
                            BPF_PROG_TYPE_SK_SKB, &obj, &parse_prog);
        if (err) {
                printf("Failed to load SK_SKB parse prog\n");
                goto out_sockmap;
        }
 
-       err = bpf_prog_load(SOCKMAP_TCP_MSG_PROG,
+       err = bpf_prog_test_load(SOCKMAP_TCP_MSG_PROG,
                            BPF_PROG_TYPE_SK_MSG, &obj, &msg_prog);
        if (err) {
                printf("Failed to load SK_SKB msg prog\n");
                goto out_sockmap;
        }
 
-       err = bpf_prog_load(SOCKMAP_VERDICT_PROG,
+       err = bpf_prog_test_load(SOCKMAP_VERDICT_PROG,
                            BPF_PROG_TYPE_SK_SKB, &obj, &verdict_prog);
        if (err) {
                printf("Failed to load SK_SKB verdict prog\n");
 
 #include "bpf_rlimit.h"
 #include "bpf_util.h"
 #include "cgroup_helpers.h"
+#include "testing_helpers.h"
 
 #define CG_PATH                        "/foo"
 #define MAX_INSNS              512
 
 
 #include "test_tcpnotify.h"
 #include "trace_helpers.h"
+#include "testing_helpers.h"
 
 #define SOCKET_BUFFER_SIZE (getpagesize() < 8192L ? getpagesize() : 8192L)
 
        if (cg_fd < 0)
                goto err;
 
-       if (bpf_prog_load(file, BPF_PROG_TYPE_SOCK_OPS, &obj, &prog_fd)) {
+       if (bpf_prog_test_load(file, BPF_PROG_TYPE_SOCK_OPS, &obj, &prog_fd)) {
                printf("FAILED: load_bpf_file failed for: %s\n", file);
                goto err;
        }
 
 #include "bpf/libbpf.h"
 
 #include "xdping.h"
+#include "testing_helpers.h"
 
 static int ifindex;
 static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
 
        snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
 
-       if (bpf_prog_load(filename, BPF_PROG_TYPE_XDP, &obj, &prog_fd)) {
+       if (bpf_prog_test_load(filename, BPF_PROG_TYPE_XDP, &obj, &prog_fd)) {
                fprintf(stderr, "load of %s failed\n", filename);
                return 1;
        }