TEST_GEN_PROGS += test_progs-bpf_gcc
 endif
 
-TEST_GEN_FILES = test_lwt_ip_encap.o test_tc_edt.o
+TEST_GEN_FILES = test_lwt_ip_encap.bpf.o test_tc_edt.bpf.o
 TEST_FILES = xsk_prereqs.sh $(wildcard progs/btf_dump_test_case_*.c)
 
 # Order correspond to 'make run_tests' order
 LSKELS_EXTRA := test_ksyms_module.c test_ksyms_weak.c kfunc_call_test_subprog.c
 SKEL_BLACKLIST += $$(LSKELS)
 
-test_static_linked.skel.h-deps := test_static_linked1.o test_static_linked2.o
-linked_funcs.skel.h-deps := linked_funcs1.o linked_funcs2.o
-linked_vars.skel.h-deps := linked_vars1.o linked_vars2.o
-linked_maps.skel.h-deps := linked_maps1.o linked_maps2.o
+test_static_linked.skel.h-deps := test_static_linked1.bpf.o test_static_linked2.bpf.o
+linked_funcs.skel.h-deps := linked_funcs1.bpf.o linked_funcs2.bpf.o
+linked_vars.skel.h-deps := linked_vars1.bpf.o linked_vars2.bpf.o
+linked_maps.skel.h-deps := linked_maps1.bpf.o linked_maps2.bpf.o
 # In the subskeleton case, we want the test_subskeleton_lib.subskel.h file
 # but that's created as a side-effect of the skel.h generation.
-test_subskeleton.skel.h-deps := test_subskeleton_lib2.o test_subskeleton_lib.o test_subskeleton.o
-test_subskeleton_lib.skel.h-deps := test_subskeleton_lib2.o test_subskeleton_lib.o
-test_usdt.skel.h-deps := test_usdt.o test_usdt_multispec.o
+test_subskeleton.skel.h-deps := test_subskeleton_lib2.bpf.o test_subskeleton_lib.bpf.o test_subskeleton.bpf.o
+test_subskeleton_lib.skel.h-deps := test_subskeleton_lib2.bpf.o test_subskeleton_lib.bpf.o
+test_usdt.skel.h-deps := test_usdt.bpf.o test_usdt_multispec.bpf.o
 
-LINKED_BPF_SRCS := $(patsubst %.o,%.c,$(foreach skel,$(LINKED_SKELS),$($(skel)-deps)))
+LINKED_BPF_SRCS := $(patsubst %.bpf.o,%.c,$(foreach skel,$(LINKED_SKELS),$($(skel)-deps)))
 
 # Set up extra TRUNNER_XXX "temporary" variables in the environment (relies on
 # $eval()) and pass control to DEFINE_TEST_RUNNER_RULES.
 TRUNNER_EXTRA_HDRS := $$(filter %.h,$(TRUNNER_EXTRA_SOURCES))
 TRUNNER_TESTS_HDR := $(TRUNNER_TESTS_DIR)/tests.h
 TRUNNER_BPF_SRCS := $$(notdir $$(wildcard $(TRUNNER_BPF_PROGS_DIR)/*.c))
-TRUNNER_BPF_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, $$(TRUNNER_BPF_SRCS))
+TRUNNER_BPF_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.bpf.o, $$(TRUNNER_BPF_SRCS))
 TRUNNER_BPF_SKELS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.skel.h,      \
                                 $$(filter-out $(SKEL_BLACKLIST) $(LINKED_BPF_SRCS),\
                                               $$(TRUNNER_BPF_SRCS)))
 # input/output directory combination
 ifeq ($($(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs),)
 $(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs := y
-$(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.o:                            \
+$(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.bpf.o:                                \
                     $(TRUNNER_BPF_PROGS_DIR)/%.c                       \
                     $(TRUNNER_BPF_PROGS_DIR)/*.h                       \
                     $$(INCLUDE_DIR)/vmlinux.h                          \
        $$(call $(TRUNNER_BPF_BUILD_RULE),$$<,$$@,                      \
                                          $(TRUNNER_BPF_CFLAGS))
 
-$(TRUNNER_BPF_SKELS): %.skel.h: %.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
+$(TRUNNER_BPF_SKELS): %.skel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
        $$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@)
        $(Q)$$(BPFTOOL) gen object $$(<:.o=.linked1.o) $$<
        $(Q)$$(BPFTOOL) gen object $$(<:.o=.linked2.o) $$(<:.o=.linked1.o)
        $(Q)$$(BPFTOOL) gen object $$(<:.o=.linked3.o) $$(<:.o=.linked2.o)
        $(Q)diff $$(<:.o=.linked2.o) $$(<:.o=.linked3.o)
-       $(Q)$$(BPFTOOL) gen skeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.o=)) > $$@
-       $(Q)$$(BPFTOOL) gen subskeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.o=)) > $$(@:.skel.h=.subskel.h)
+       $(Q)$$(BPFTOOL) gen skeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$@
+       $(Q)$$(BPFTOOL) gen subskeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$(@:.skel.h=.subskel.h)
 
-$(TRUNNER_BPF_LSKELS): %.lskel.h: %.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
+$(TRUNNER_BPF_LSKELS): %.lskel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
        $$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@)
        $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked1.o) $$<
        $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked2.o) $$(<:.o=.llinked1.o)
        $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked3.o) $$(<:.o=.llinked2.o)
        $(Q)diff $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
-       $(Q)$$(BPFTOOL) gen skeleton -L $$(<:.o=.llinked3.o) name $$(notdir $$(<:.o=_lskel)) > $$@
+       $(Q)$$(BPFTOOL) gen skeleton -L $$(<:.o=.llinked3.o) name $$(notdir $$(<:.bpf.o=_lskel)) > $$@
 
 $(TRUNNER_BPF_SKELS_LINKED): $(TRUNNER_BPF_OBJS) $(BPFTOOL) | $(TRUNNER_OUTPUT)
-       $$(call msg,LINK-BPF,$(TRUNNER_BINARY),$$(@:.skel.h=.o))
+       $$(call msg,LINK-BPF,$(TRUNNER_BINARY),$$(@:.skel.h=.bpf.o))
        $(Q)$$(BPFTOOL) gen object $$(@:.skel.h=.linked1.o) $$(addprefix $(TRUNNER_OUTPUT)/,$$($$(@F)-deps))
        $(Q)$$(BPFTOOL) gen object $$(@:.skel.h=.linked2.o) $$(@:.skel.h=.linked1.o)
        $(Q)$$(BPFTOOL) gen object $$(@:.skel.h=.linked3.o) $$(@:.skel.h=.linked2.o)
                             | $(TRUNNER_BINARY)-extras
        $$(call msg,BINARY,,$$@)
        $(Q)$$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@
-       $(Q)$(RESOLVE_BTFIDS) --btf $(TRUNNER_OUTPUT)/btf_data.o $$@
+       $(Q)$(RESOLVE_BTFIDS) --btf $(TRUNNER_OUTPUT)/btf_data.bpf.o $$@
        $(Q)ln -sf $(if $2,..,.)/tools/build/bpftool/bootstrap/bpftool $(if $2,$2/)bpftool
 
 endef
 
 
 __  https://reviews.llvm.org/D78466
 
-bpf_verif_scale/loop6.o test failure with Clang 12
-==================================================
+bpf_verif_scale/loop6.bpf.o test failure with Clang 12
+======================================================
 
 With Clang 12, the following bpf_verif_scale test failed:
-  * ``bpf_verif_scale/loop6.o``
+  * ``bpf_verif_scale/loop6.bpf.o``
 
 The verifier output looks like
 
 Using clang 13 to compile old libbpf which has static linker support,
 there will be a compilation failure::
 
-  libbpf: ELF relo #0 in section #6 has unexpected type 2 in .../bpf_tcp_nogpl.o
+  libbpf: ELF relo #0 in section #6 has unexpected type 2 in .../bpf_tcp_nogpl.bpf.o
 
 Here, ``type 2`` refers to new relocation type ``R_BPF_64_ABS64``.
 To fix this issue, user newer libbpf.
 
 int main(int argc, char **argv)
 {
        const char *probe_name = "syscalls/sys_enter_nanosleep";
-       const char *file = "get_cgroup_id_kern.o";
+       const char *file = "get_cgroup_id_kern.bpf.o";
        int err, bytes, efd, prog_fd, pmu_fd;
        int cgroup_fd, cgidmap_fd, pidmap_fd;
        struct perf_event_attr attr = {};
 
 {
        const __u64 array_magic_value = 0xfaceb00c;
        const __u32 array_key = 0;
-       const char *file = "./test_obj_id.o";
+       const char *file = "./test_obj_id.bpf.o";
        const char *expected_prog_name = "test_obj_id";
        const char *expected_map_name = "test_map_id";
        const __u64 nsec_per_sec = 1000000000;
 
 
 void test_verif_scale1()
 {
-       scale_test("test_verif_scale1.o", BPF_PROG_TYPE_SCHED_CLS, false);
+       scale_test("test_verif_scale1.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
 }
 
 void test_verif_scale2()
 {
-       scale_test("test_verif_scale2.o", BPF_PROG_TYPE_SCHED_CLS, false);
+       scale_test("test_verif_scale2.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
 }
 
 void test_verif_scale3()
 {
-       scale_test("test_verif_scale3.o", BPF_PROG_TYPE_SCHED_CLS, false);
+       scale_test("test_verif_scale3.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
 }
 
 void test_verif_scale_pyperf_global()
 {
-       scale_test("pyperf_global.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("pyperf_global.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_pyperf_subprogs()
 {
-       scale_test("pyperf_subprogs.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("pyperf_subprogs.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_pyperf50()
 {
        /* full unroll by llvm */
-       scale_test("pyperf50.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("pyperf50.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_pyperf100()
 {
        /* full unroll by llvm */
-       scale_test("pyperf100.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("pyperf100.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_pyperf180()
 {
        /* full unroll by llvm */
-       scale_test("pyperf180.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("pyperf180.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_pyperf600()
         * 16k insns in loop body.
         * Total of 5 such loops. Total program size ~82k insns.
         */
-       scale_test("pyperf600.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("pyperf600.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_pyperf600_bpf_loop(void)
 {
        /* use the bpf_loop helper*/
-       scale_test("pyperf600_bpf_loop.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("pyperf600_bpf_loop.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_pyperf600_nounroll()
         * ~110 insns in loop body.
         * Total of 5 such loops. Total program size ~1500 insns.
         */
-       scale_test("pyperf600_nounroll.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("pyperf600_nounroll.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_loop1()
 {
-       scale_test("loop1.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("loop1.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_loop2()
 {
-       scale_test("loop2.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("loop2.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_loop3_fail()
 {
-       scale_test("loop3.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */);
+       scale_test("loop3.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */);
 }
 
 void test_verif_scale_loop4()
 {
-       scale_test("loop4.o", BPF_PROG_TYPE_SCHED_CLS, false);
+       scale_test("loop4.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
 }
 
 void test_verif_scale_loop5()
 {
-       scale_test("loop5.o", BPF_PROG_TYPE_SCHED_CLS, false);
+       scale_test("loop5.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
 }
 
 void test_verif_scale_loop6()
 {
-       scale_test("loop6.o", BPF_PROG_TYPE_KPROBE, false);
+       scale_test("loop6.bpf.o", BPF_PROG_TYPE_KPROBE, false);
 }
 
 void test_verif_scale_strobemeta()
         * Total program size 20.8k insn.
         * ~350k processed_insns
         */
-       scale_test("strobemeta.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("strobemeta.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_strobemeta_bpf_loop(void)
 {
        /* use the bpf_loop helper*/
-       scale_test("strobemeta_bpf_loop.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("strobemeta_bpf_loop.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_strobemeta_nounroll1()
 {
        /* no unroll, tiny loops */
-       scale_test("strobemeta_nounroll1.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("strobemeta_nounroll1.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_strobemeta_nounroll2()
 {
        /* no unroll, tiny loops */
-       scale_test("strobemeta_nounroll2.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("strobemeta_nounroll2.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_strobemeta_subprogs()
 {
        /* non-inlined subprogs */
-       scale_test("strobemeta_subprogs.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
+       scale_test("strobemeta_subprogs.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
 }
 
 void test_verif_scale_sysctl_loop1()
 {
-       scale_test("test_sysctl_loop1.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false);
+       scale_test("test_sysctl_loop1.bpf.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false);
 }
 
 void test_verif_scale_sysctl_loop2()
 {
-       scale_test("test_sysctl_loop2.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false);
+       scale_test("test_sysctl_loop2.bpf.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false);
 }
 
 void test_verif_scale_xdp_loop()
 {
-       scale_test("test_xdp_loop.o", BPF_PROG_TYPE_XDP, false);
+       scale_test("test_xdp_loop.bpf.o", BPF_PROG_TYPE_XDP, false);
 }
 
 void test_verif_scale_seg6_loop()
 {
-       scale_test("test_seg6_loop.o", BPF_PROG_TYPE_LWT_SEG6LOCAL, false);
+       scale_test("test_seg6_loop.bpf.o", BPF_PROG_TYPE_LWT_SEG6LOCAL, false);
 }
 
 void test_verif_twfw()
 {
-       scale_test("twfw.o", BPF_PROG_TYPE_CGROUP_SKB, false);
+       scale_test("twfw.bpf.o", BPF_PROG_TYPE_CGROUP_SKB, false);
 }
 
 };
 
 static struct btf_file_test file_tests[] = {
-       { .file = "test_btf_newkv.o", },
-       { .file = "test_btf_nokv.o", .btf_kv_notfound = true, },
+       { .file = "test_btf_newkv.bpf.o", },
+       { .file = "test_btf_nokv.bpf.o", .btf_kv_notfound = true, },
 };
 
 static void do_test_file(unsigned int test_num)
 
        int err = 0, fd = -1;
        FILE *f = NULL;
 
-       snprintf(test_file, sizeof(test_file), "%s.o", t->file);
+       snprintf(test_file, sizeof(test_file), "%s.bpf.o", t->file);
 
        btf = btf__parse_elf(test_file, NULL);
        if (!ASSERT_OK_PTR(btf, "btf_parse_elf")) {
        char license[4] = "GPL";
        struct btf_dump *d;
 
-       btf = btf__parse("xdping_kern.o", NULL);
-       if (!ASSERT_OK_PTR(btf, "xdping_kern.o BTF not found"))
+       btf = btf__parse("xdping_kern.bpf.o", NULL);
+       if (!ASSERT_OK_PTR(btf, "xdping_kern.bpf.o BTF not found"))
                return;
 
        d = btf_dump__new(btf, btf_dump_snprintf, str, NULL);
 
        int var_id;
 
        /* Load BTF in native endianness */
-       btf = btf__parse_elf("btf_dump_test_case_syntax.o", NULL);
+       btf = btf__parse_elf("btf_dump_test_case_syntax.bpf.o", NULL);
        if (!ASSERT_OK_PTR(btf, "parse_native_btf"))
                goto err_out;
 
 
        __u16 expected_peer_port = 60000;
        struct bpf_program *prog;
        struct bpf_object *obj;
-       const char *obj_file = v4 ? "connect_force_port4.o" : "connect_force_port6.o";
+       const char *obj_file = v4 ? "connect_force_port4.bpf.o" : "connect_force_port6.bpf.o";
        int fd, err;
        __u32 duration = 0;
 
 
 
 #define MODULES_CASE(name, pg_name, tp_name) {                         \
        .case_name = name,                                              \
-       .bpf_obj_file = "test_core_reloc_module.o",                     \
+       .bpf_obj_file = "test_core_reloc_module.bpf.o",                 \
        .btf_src_file = NULL, /* find in kernel module BTFs */          \
        .input = "",                                                    \
        .input_len = 0,                                                 \
 
 #define FLAVORS_CASE_COMMON(name)                                      \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_flavors.o",                    \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_flavors.bpf.o",                \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_flavors"                                \
 
 
 #define NESTING_CASE_COMMON(name)                                      \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_nesting.o",                    \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_nesting.bpf.o",                \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_nesting"                                \
 
 
 #define ARRAYS_CASE_COMMON(name)                                       \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_arrays.o",                     \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_arrays.bpf.o",                 \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_arrays"                                 \
 
 
 #define PRIMITIVES_CASE_COMMON(name)                                   \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_primitives.o",                 \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_primitives.bpf.o",             \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_primitives"                             \
 
 
 #define MODS_CASE(name) {                                              \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_mods.o",                       \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_mods.bpf.o",                   \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .input = STRUCT_TO_CHAR_PTR(core_reloc_##name) {                \
                .a = 1,                                                 \
                .b = 2,                                                 \
 
 #define PTR_AS_ARR_CASE(name) {                                                \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_ptr_as_arr.o",                 \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_ptr_as_arr.bpf.o",             \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .input = (const char *)&(struct core_reloc_##name []){          \
                { .a = 1 },                                             \
                { .a = 2 },                                             \
 
 #define INTS_CASE_COMMON(name)                                         \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_ints.o",                       \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_ints.bpf.o",                   \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_ints"
 
 
 #define FIELD_EXISTS_CASE_COMMON(name)                                 \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_existence.o",                  \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_existence.bpf.o",              \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_existence"
 
 #define BITFIELDS_CASE_COMMON(objfile, test_name_prefix,  name)                \
        .case_name = test_name_prefix#name,                             \
        .bpf_obj_file = objfile,                                        \
-       .btf_src_file = "btf__core_reloc_" #name ".o"
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o"
 
 #define BITFIELDS_CASE(name, ...) {                                    \
-       BITFIELDS_CASE_COMMON("test_core_reloc_bitfields_probed.o",     \
+       BITFIELDS_CASE_COMMON("test_core_reloc_bitfields_probed.bpf.o", \
                              "probed:", name),                         \
        .input = STRUCT_TO_CHAR_PTR(core_reloc_##name) __VA_ARGS__,     \
        .input_len = sizeof(struct core_reloc_##name),                  \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_bitfields",                             \
 }, {                                                                   \
-       BITFIELDS_CASE_COMMON("test_core_reloc_bitfields_direct.o",     \
+       BITFIELDS_CASE_COMMON("test_core_reloc_bitfields_direct.bpf.o", \
                              "direct:", name),                         \
        .input = STRUCT_TO_CHAR_PTR(core_reloc_##name) __VA_ARGS__,     \
        .input_len = sizeof(struct core_reloc_##name),                  \
 
 
 #define BITFIELDS_ERR_CASE(name) {                                     \
-       BITFIELDS_CASE_COMMON("test_core_reloc_bitfields_probed.o",     \
+       BITFIELDS_CASE_COMMON("test_core_reloc_bitfields_probed.bpf.o", \
                              "probed:", name),                         \
        .fails = true,                                                  \
-       .run_btfgen_fails = true,                                                       \
+       .run_btfgen_fails = true,                                       \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_bitfields",                             \
 }, {                                                                   \
-       BITFIELDS_CASE_COMMON("test_core_reloc_bitfields_direct.o",     \
+       BITFIELDS_CASE_COMMON("test_core_reloc_bitfields_direct.bpf.o", \
                              "direct:", name),                         \
        .fails = true,                                                  \
        .run_btfgen_fails = true,                                                       \
 
 #define SIZE_CASE_COMMON(name)                                         \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_size.o",                       \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_size.bpf.o",                   \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_size"
 
 #define SIZE_ERR_CASE(name) {                                          \
        SIZE_CASE_COMMON(name),                                         \
        .fails = true,                                                  \
-       .run_btfgen_fails = true,                                                       \
+       .run_btfgen_fails = true,                                       \
 }
 
 #define TYPE_BASED_CASE_COMMON(name)                                   \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_type_based.o",                 \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_type_based.bpf.o",             \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_type_based"
 
 
 #define TYPE_ID_CASE_COMMON(name)                                      \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_type_id.o",                    \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_type_id.bpf.o",                \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_type_id"
 
 
 #define ENUMVAL_CASE_COMMON(name)                                      \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_enumval.o",                    \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_enumval.bpf.o",                \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_enumval"
 
 
 #define ENUM64VAL_CASE_COMMON(name)                                    \
        .case_name = #name,                                             \
-       .bpf_obj_file = "test_core_reloc_enum64val.o",                  \
-       .btf_src_file = "btf__core_reloc_" #name ".o",                  \
+       .bpf_obj_file = "test_core_reloc_enum64val.bpf.o",              \
+       .btf_src_file = "btf__core_reloc_" #name ".bpf.o",              \
        .raw_tp_name = "sys_enter",                                     \
        .prog_name = "test_core_enum64val"
 
        /* validate we can find kernel image and use its BTF for relocs */
        {
                .case_name = "kernel",
-               .bpf_obj_file = "test_core_reloc_kernel.o",
+               .bpf_obj_file = "test_core_reloc_kernel.bpf.o",
                .btf_src_file = NULL, /* load from /lib/modules/$(uname -r) */
                .input = "",
                .input_len = 0,
        /* validate edge cases of capturing relocations */
        {
                .case_name = "misc",
-               .bpf_obj_file = "test_core_reloc_misc.o",
-               .btf_src_file = "btf__core_reloc_misc.o",
+               .bpf_obj_file = "test_core_reloc_misc.bpf.o",
+               .btf_src_file = "btf__core_reloc_misc.bpf.o",
                .input = (const char *)&(struct core_reloc_misc_extensible[]){
                        { .a = 1 },
                        { .a = 2 }, /* not read */
 
        const char *prog_name[] = {
                "fexit/test_pkt_md_access",
        };
-       test_fexit_bpf2bpf_common("./fexit_bpf2bpf_simple.o",
-                                 "./test_pkt_md_access.o",
+       test_fexit_bpf2bpf_common("./fexit_bpf2bpf_simple.bpf.o",
+                                 "./test_pkt_md_access.bpf.o",
                                  ARRAY_SIZE(prog_name),
                                  prog_name, true, NULL);
 }
                "fexit/test_pkt_access_subprog2",
                "fexit/test_pkt_access_subprog3",
        };
-       test_fexit_bpf2bpf_common("./fexit_bpf2bpf.o",
-                                 "./test_pkt_access.o",
+       test_fexit_bpf2bpf_common("./fexit_bpf2bpf.bpf.o",
+                                 "./test_pkt_access.bpf.o",
                                  ARRAY_SIZE(prog_name),
                                  prog_name, true, NULL);
 }
                "freplace/get_constant",
                "freplace/test_pkt_write_access_subprog",
        };
-       test_fexit_bpf2bpf_common("./fexit_bpf2bpf.o",
-                                 "./test_pkt_access.o",
+       test_fexit_bpf2bpf_common("./fexit_bpf2bpf.bpf.o",
+                                 "./test_pkt_access.bpf.o",
                                  ARRAY_SIZE(prog_name),
                                  prog_name, true, NULL);
 }
        const char *prog_name[] = {
                "freplace/do_bind",
        };
-       test_fexit_bpf2bpf_common("./freplace_connect4.o",
-                                 "./connect4_prog.o",
+       test_fexit_bpf2bpf_common("./freplace_connect4.bpf.o",
+                                 "./connect4_prog.bpf.o",
                                  ARRAY_SIZE(prog_name),
                                  prog_name, false, NULL);
 }
 {
        const char *prog_name = "security_new_get_constant";
        const char *tgt_name = "get_constant";
-       const char *tgt_obj_file = "./test_pkt_access.o";
+       const char *tgt_obj_file = "./test_pkt_access.bpf.o";
        struct bpf_program *prog = NULL;
        struct bpf_object *tgt_obj;
        struct bpf_link *link;
        const char *prog_name[] = {
                "freplace/get_constant",
        };
-       test_fexit_bpf2bpf_common("./freplace_get_constant.o",
-                                 "./test_pkt_access.o",
+       test_fexit_bpf2bpf_common("./freplace_get_constant.bpf.o",
+                                 "./test_pkt_access.bpf.o",
                                  ARRAY_SIZE(prog_name),
                                  prog_name, true, test_second_attach);
 }
 static void test_fmod_ret_freplace(void)
 {
        struct bpf_object *freplace_obj = NULL, *pkt_obj, *fmod_obj = NULL;
-       const char *freplace_name = "./freplace_get_constant.o";
-       const char *fmod_ret_name = "./fmod_ret_freplace.o";
+       const char *freplace_name = "./freplace_get_constant.bpf.o";
+       const char *fmod_ret_name = "./fmod_ret_freplace.bpf.o";
        DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts);
-       const char *tgt_name = "./test_pkt_access.o";
+       const char *tgt_name = "./test_pkt_access.bpf.o";
        struct bpf_link *freplace_link = NULL;
        struct bpf_program *prog;
        __u32 duration = 0;
        const char *prog_name[] = {
                "freplace/cls_redirect",
        };
-       test_fexit_bpf2bpf_common("./freplace_cls_redirect.o",
-                                 "./test_cls_redirect.o",
+       test_fexit_bpf2bpf_common("./freplace_cls_redirect.bpf.o",
+                                 "./test_cls_redirect.bpf.o",
                                  ARRAY_SIZE(prog_name),
                                  prog_name, false, NULL);
 }
 static void test_func_replace_return_code(void)
 {
        /* test invalid return code in the replaced program */
-       test_obj_load_failure_common("./freplace_connect_v4_prog.o",
-                                    "./connect4_prog.o");
+       test_obj_load_failure_common("./freplace_connect_v4_prog.bpf.o",
+                                    "./connect4_prog.bpf.o");
 }
 
 static void test_func_map_prog_compatibility(void)
 {
        /* test with spin lock map value in the replaced program */
-       test_obj_load_failure_common("./freplace_attach_probe.o",
-                                    "./test_attach_probe.o");
+       test_obj_load_failure_common("./freplace_attach_probe.bpf.o",
+                                    "./test_attach_probe.bpf.o");
 }
 
 static void test_func_replace_global_func(void)
                "freplace/test_pkt_access",
        };
 
-       test_fexit_bpf2bpf_common("./freplace_global_func.o",
-                                 "./test_pkt_access.o",
+       test_fexit_bpf2bpf_common("./freplace_global_func.bpf.o",
+                                 "./test_pkt_access.bpf.o",
                                  ARRAY_SIZE(prog_name),
                                  prog_name, false, NULL);
 }
 
 
 void test_get_stack_raw_tp(void)
 {
-       const char *file = "./test_get_stack_rawtp.o";
-       const char *file_err = "./test_get_stack_rawtp_err.o";
+       const char *file = "./test_get_stack_rawtp.bpf.o";
+       const char *file_err = "./test_get_stack_rawtp_err.bpf.o";
        const char *prog_name = "bpf_prog1";
        int i, err, prog_fd, exp_cnt = MAX_CNT_RAWTP;
        struct perf_buffer *pb = NULL;
 
 
 void test_global_data(void)
 {
-       const char *file = "./test_global_data.o";
+       const char *file = "./test_global_data.bpf.o";
        struct bpf_object *obj;
        int err, prog_fd;
        LIBBPF_OPTS(bpf_test_run_opts, topts,
 
 
 void test_global_data_init(void)
 {
-       const char *file = "./test_global_data.o";
+       const char *file = "./test_global_data.bpf.o";
        int err = -ENOMEM, map_fd, zero = 0;
        __u8 *buff = NULL, *newval = NULL;
        struct bpf_object *obj;
 
 
 void test_global_func_args(void)
 {
-       const char *file = "./test_global_func_args.o";
+       const char *file = "./test_global_func_args.bpf.o";
        struct bpf_object *obj;
        int err, prog_fd;
        LIBBPF_OPTS(bpf_test_run_opts, topts,
 
        const int zero = 0;
        bool test_ok[2];
 
-       err = bpf_prog_test_load("./test_pkt_access.o", BPF_PROG_TYPE_SCHED_CLS,
+       err = bpf_prog_test_load("./test_pkt_access.bpf.o", BPF_PROG_TYPE_SCHED_CLS,
                                 &obj, &prog_fd);
        if (CHECK(err, "prog_load sched cls", "err %d errno %d\n", err, errno))
                return;
 
 void test_l4lb_all(void)
 {
        if (test__start_subtest("l4lb_inline"))
-               test_l4lb("test_l4lb.o");
+               test_l4lb("test_l4lb.bpf.o");
        if (test__start_subtest("l4lb_noinline"))
-               test_l4lb("test_l4lb_noinline.o");
+               test_l4lb("test_l4lb_noinline.bpf.o");
 }
 
        if (CHECK_FAIL(server_fd < 0))
                goto close_cgroup_fd;
 
-       err = bpf_prog_test_load("./load_bytes_relative.o", BPF_PROG_TYPE_CGROUP_SKB,
-                           &obj, &prog_fd);
+       err = bpf_prog_test_load("./load_bytes_relative.bpf.o", BPF_PROG_TYPE_CGROUP_SKB,
+                                &obj, &prog_fd);
        if (CHECK_FAIL(err))
                goto close_server_fd;
 
 
 
 void test_map_lock(void)
 {
-       const char *file = "./test_map_lock.o";
+       const char *file = "./test_map_lock.bpf.o";
        int prog_fd, map_fd[2], vars[17] = {};
        pthread_t thread_id[6];
        struct bpf_object *obj = NULL;
 
 
 void test_pinning(void)
 {
-       const char *file_invalid = "./test_pinning_invalid.o";
+       const char *file_invalid = "./test_pinning_invalid.bpf.o";
        const char *custpinpath = "/sys/fs/bpf/custom/pinmap";
        const char *nopinpath = "/sys/fs/bpf/nopinmap";
        const char *nopinpath2 = "/sys/fs/bpf/nopinmap2";
        const char *custpath = "/sys/fs/bpf/custom";
        const char *pinpath = "/sys/fs/bpf/pinmap";
-       const char *file = "./test_pinning.o";
+       const char *file = "./test_pinning.bpf.o";
        __u32 map_id, map_id2, duration = 0;
        struct stat statbuf = {};
        struct bpf_object *obj;
 
 
 void test_pkt_access(void)
 {
-       const char *file = "./test_pkt_access.o";
+       const char *file = "./test_pkt_access.bpf.o";
        struct bpf_object *obj;
        int err, prog_fd;
        LIBBPF_OPTS(bpf_test_run_opts, topts,
 
 
 void test_pkt_md_access(void)
 {
-       const char *file = "./test_pkt_md_access.o";
+       const char *file = "./test_pkt_md_access.bpf.o";
        struct bpf_object *obj;
        int err, prog_fd;
        LIBBPF_OPTS(bpf_test_run_opts, topts,
 
 #endif
        };
        enum { prog_count = ARRAY_SIZE(prog_names) };
-       const char *obj_file = "./test_probe_user.o";
+       const char *obj_file = "./test_probe_user.bpf.o";
        DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts, );
        int err, results_map_fd, sock_fd, duration = 0;
        struct sockaddr curr, orig, tmp;
 
                vals[i] = rand();
 
        if (type == QUEUE)
-               strncpy(file, "./test_queue_map.o", sizeof(file));
+               strncpy(file, "./test_queue_map.bpf.o", sizeof(file));
        else if (type == STACK)
-               strncpy(file, "./test_stack_map.o", sizeof(file));
+               strncpy(file, "./test_stack_map.bpf.o", sizeof(file));
        else
                return;
 
 
 
 void test_rdonly_maps(void)
 {
-       const char *file = "test_rdonly_maps.o";
+       const char *file = "test_rdonly_maps.bpf.o";
        struct rdonly_map_subtest subtests[] = {
                { "skip loop", "skip_loop", 0, 0 },
                { "part loop", "part_loop", 3, 2 + 3 + 4 },
 
 
 void test_reference_tracking(void)
 {
-       const char *file = "test_sk_lookup_kern.o";
+       const char *file = "test_sk_lookup_kern.bpf.o";
        const char *obj_name = "ref_track";
        DECLARE_LIBBPF_OPTS(bpf_object_open_opts, open_opts,
                .object_name = obj_name,
 
        int type_id;
        __u32 nr;
 
-       btf = btf__parse_elf("btf_data.o", NULL);
+       btf = btf__parse_elf("btf_data.bpf.o", NULL);
        if (CHECK(libbpf_get_error(btf), "resolve",
                  "Failed to load BTF from btf_data.o\n"))
                return -1;
 
        struct bpf_map *map;
        int err;
 
-       obj = bpf_object__open("test_select_reuseport_kern.o");
+       obj = bpf_object__open("test_select_reuseport_kern.bpf.o");
        err = libbpf_get_error(obj);
-       RET_ERR(err, "open test_select_reuseport_kern.o",
+       RET_ERR(err, "open test_select_reuseport_kern.bpf.o",
                "obj:%p PTR_ERR(obj):%d\n", obj, err);
 
        map = bpf_object__find_map_by_name(obj, "outer_map");
 
        if (CHECK_FAIL(system("tc qdisc add dev lo clsact")))
                return false;
        sprintf(tc_cmd, "%s %s %s %s", "tc filter add dev lo ingress bpf",
-                      "direct-action object-file ./test_sk_assign.o",
+                      "direct-action object-file ./test_sk_assign.bpf.o",
                       "section tc",
                       (env.verbosity < VERBOSE_VERY) ? " 2>/dev/null" : "verbose");
        if (CHECK(system(tc_cmd), "BPF load failed;",
 
        struct bpf_object *obj;
        int err, prog_fd, i;
 
-       err = bpf_prog_test_load("./test_skb_ctx.o", BPF_PROG_TYPE_SCHED_CLS,
+       err = bpf_prog_test_load("./test_skb_ctx.bpf.o", BPF_PROG_TYPE_SCHED_CLS,
                                 &obj, &prog_fd);
        if (!ASSERT_OK(err, "load"))
                return;
 
        struct bpf_object *obj;
        int err, prog_fd;
 
-       err = bpf_prog_test_load("./test_skb_helpers.o",
+       err = bpf_prog_test_load("./test_skb_helpers.bpf.o",
                                 BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
        if (!ASSERT_OK(err, "load"))
                return;
 
        pthread_t tid;
        int err;
 
-       obj = bpf_object__open_file("sockopt_inherit.o", NULL);
+       obj = bpf_object__open_file("sockopt_inherit.bpf.o", NULL);
        if (!ASSERT_OK_PTR(obj, "obj_open"))
                return;
 
 
        if (CHECK_FAIL(cg_child < 0))
                goto out;
 
-       obj = bpf_object__open_file("sockopt_multi.o", NULL);
+       obj = bpf_object__open_file("sockopt_multi.bpf.o", NULL);
        if (!ASSERT_OK_PTR(obj, "obj_load"))
                goto out;
 
 
 
 void test_spinlock(void)
 {
-       const char *file = "./test_spin_lock.o";
+       const char *file = "./test_spin_lock.bpf.o";
        pthread_t thread_id[4];
        struct bpf_object *obj = NULL;
        int prog_fd;
 
        int control_map_fd, stackid_hmap_fd, stackmap_fd, stack_amap_fd;
        const char *prog_name = "oncpu";
        int err, prog_fd, stack_trace_len;
-       const char *file = "./test_stacktrace_map.o";
+       const char *file = "./test_stacktrace_map.bpf.o";
        __u32 key, val, duration = 0;
        struct bpf_program *prog;
        struct bpf_object *obj;
 
 {
        const char *prog_name = "oncpu";
        int control_map_fd, stackid_hmap_fd, stackmap_fd;
-       const char *file = "./test_stacktrace_map.o";
+       const char *file = "./test_stacktrace_map.bpf.o";
        __u32 key, val, duration = 0;
        int err, prog_fd;
        struct bpf_program *prog;
 
                .repeat = 1,
        );
 
-       err = bpf_prog_test_load("tailcall1.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
-                           &prog_fd);
+       err = bpf_prog_test_load("tailcall1.bpf.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+                                &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
                .repeat = 1,
        );
 
-       err = bpf_prog_test_load("tailcall2.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
-                           &prog_fd);
+       err = bpf_prog_test_load("tailcall2.bpf.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+                                &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
  */
 static void test_tailcall_3(void)
 {
-       test_tailcall_count("tailcall3.o");
+       test_tailcall_count("tailcall3.bpf.o");
 }
 
 /* test_tailcall_6 checks that the count value of the tail call limit
  */
 static void test_tailcall_6(void)
 {
-       test_tailcall_count("tailcall6.o");
+       test_tailcall_count("tailcall6.bpf.o");
 }
 
 /* test_tailcall_4 checks that the kernel properly selects indirect jump
                .repeat = 1,
        );
 
-       err = bpf_prog_test_load("tailcall4.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
-                           &prog_fd);
+       err = bpf_prog_test_load("tailcall4.bpf.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+                                &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
                .repeat = 1,
        );
 
-       err = bpf_prog_test_load("tailcall5.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
-                           &prog_fd);
+       err = bpf_prog_test_load("tailcall5.bpf.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
+                                &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
                .repeat = 1,
        );
 
-       err = bpf_prog_test_load("tailcall_bpf2bpf1.o", BPF_PROG_TYPE_SCHED_CLS,
-                           &obj, &prog_fd);
+       err = bpf_prog_test_load("tailcall_bpf2bpf1.bpf.o", BPF_PROG_TYPE_SCHED_CLS,
+                                &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
                .repeat = 1,
        );
 
-       err = bpf_prog_test_load("tailcall_bpf2bpf2.o", BPF_PROG_TYPE_SCHED_CLS,
-                           &obj, &prog_fd);
+       err = bpf_prog_test_load("tailcall_bpf2bpf2.bpf.o", BPF_PROG_TYPE_SCHED_CLS,
+                                &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
                .repeat = 1,
        );
 
-       err = bpf_prog_test_load("tailcall_bpf2bpf3.o", BPF_PROG_TYPE_SCHED_CLS,
-                           &obj, &prog_fd);
+       err = bpf_prog_test_load("tailcall_bpf2bpf3.bpf.o", BPF_PROG_TYPE_SCHED_CLS,
+                                &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
                .repeat = 1,
        );
 
-       err = bpf_prog_test_load("tailcall_bpf2bpf4.o", BPF_PROG_TYPE_SCHED_CLS,
-                           &obj, &prog_fd);
+       err = bpf_prog_test_load("tailcall_bpf2bpf4.bpf.o", BPF_PROG_TYPE_SCHED_CLS,
+                                &obj, &prog_fd);
        if (CHECK_FAIL(err))
                return;
 
 
 
 void test_task_fd_query_rawtp(void)
 {
-       const char *file = "./test_get_stack_rawtp.o";
+       const char *file = "./test_get_stack_rawtp.bpf.o";
        __u64 probe_offset, probe_addr;
        __u32 len, prog_id, fd_type;
        struct bpf_object *obj;
 
 static void test_task_fd_query_tp_core(const char *probe_name,
                                       const char *tp_name)
 {
-       const char *file = "./test_tracepoint.o";
+       const char *file = "./test_tracepoint.bpf.o";
        int err, bytes, efd, prog_fd, pmu_fd;
        struct perf_event_attr attr = {};
        __u64 probe_offset, probe_addr;
 
 
 void test_tcp_estats(void)
 {
-       const char *file = "./test_tcp_estats.o";
+       const char *file = "./test_tcp_estats.bpf.o";
        int err, prog_fd;
        struct bpf_object *obj;
        __u32 duration = 0;
 
 void test_test_global_funcs(void)
 {
        struct test_def tests[] = {
-               { "test_global_func1.o", "combined stack size of 4 calls is 544" },
-               { "test_global_func2.o" },
-               { "test_global_func3.o" , "the call stack of 8 frames" },
-               { "test_global_func4.o" },
-               { "test_global_func5.o" , "expected pointer to ctx, but got PTR" },
-               { "test_global_func6.o" , "modified ctx ptr R2" },
-               { "test_global_func7.o" , "foo() doesn't return scalar" },
-               { "test_global_func8.o" },
-               { "test_global_func9.o" },
-               { "test_global_func10.o", "invalid indirect read from stack" },
-               { "test_global_func11.o", "Caller passes invalid args into func#1" },
-               { "test_global_func12.o", "invalid mem access 'mem_or_null'" },
-               { "test_global_func13.o", "Caller passes invalid args into func#1" },
-               { "test_global_func14.o", "reference type('FWD S') size cannot be determined" },
-               { "test_global_func15.o", "At program exit the register R0 has value" },
-               { "test_global_func16.o", "invalid indirect read from stack" },
-               { "test_global_func17.o", "Caller passes invalid args into func#1" },
+               { "test_global_func1.bpf.o", "combined stack size of 4 calls is 544" },
+               { "test_global_func2.bpf.o" },
+               { "test_global_func3.bpf.o", "the call stack of 8 frames" },
+               { "test_global_func4.bpf.o" },
+               { "test_global_func5.bpf.o", "expected pointer to ctx, but got PTR" },
+               { "test_global_func6.bpf.o", "modified ctx ptr R2" },
+               { "test_global_func7.bpf.o", "foo() doesn't return scalar" },
+               { "test_global_func8.bpf.o" },
+               { "test_global_func9.bpf.o" },
+               { "test_global_func10.bpf.o", "invalid indirect read from stack" },
+               { "test_global_func11.bpf.o", "Caller passes invalid args into func#1" },
+               { "test_global_func12.bpf.o", "invalid mem access 'mem_or_null'" },
+               { "test_global_func13.bpf.o", "Caller passes invalid args into func#1" },
+               { "test_global_func14.bpf.o", "reference type('FWD S') size cannot be determined" },
+               { "test_global_func15.bpf.o", "At program exit the register R0 has value" },
+               { "test_global_func16.bpf.o", "invalid indirect read from stack" },
+               { "test_global_func17.bpf.o", "Caller passes invalid args into func#1" },
        };
        libbpf_print_fn_t old_print_fn = NULL;
        int err, i, duration = 0;
 
        if (CHECK_FAIL(prctl(PR_GET_NAME, comm, 0L, 0L, 0L)))
                return;
 
-       obj = bpf_object__open_file("./test_overhead.o", NULL);
+       obj = bpf_object__open_file("./test_overhead.bpf.o", NULL);
        if (!ASSERT_OK_PTR(obj, "obj_open_file"))
                return;
 
 
        const int num_progs = 3;
        int i, j, bytes, efd, err, prog_fd[num_progs], pmu_fd[num_progs];
        __u32 duration = 0, info_len, saved_prog_ids[num_progs];
-       const char *file = "./test_tracepoint.o";
+       const char *file = "./test_tracepoint.bpf.o";
        struct perf_event_query_bpf *query;
        struct perf_event_attr attr = {};
        struct bpf_object *obj[num_progs];
 
 /* TODO: use different target function to run in concurrent mode */
 void serial_test_trampoline_count(void)
 {
-       char *file = "test_trampoline_count.o";
+       char *file = "test_trampoline_count.bpf.o";
        char *const progs[] = { "fentry_test", "fmod_ret_test", "fexit_test" };
        struct inst inst[MAX_TRAMP_PROGS + 1] = {};
        struct bpf_program *prog;
 
        struct vip key6 = {.protocol = 6, .family = AF_INET6};
        struct iptnl_info value4 = {.family = AF_INET};
        struct iptnl_info value6 = {.family = AF_INET6};
-       const char *file = "./test_xdp.o";
+       const char *file = "./test_xdp.bpf.o";
        struct bpf_object *obj;
        char buf[128];
        struct ipv6hdr iph6;
 
 
 static void test_xdp_update_frags(void)
 {
-       const char *file = "./test_xdp_update_frags.o";
+       const char *file = "./test_xdp_update_frags.bpf.o";
        int err, prog_fd, max_skb_frags, buf_size, num;
        struct bpf_program *prog;
        struct bpf_object *obj;
 
 
 static void test_xdp_adjust_tail_shrink(void)
 {
-       const char *file = "./test_xdp_adjust_tail_shrink.o";
+       const char *file = "./test_xdp_adjust_tail_shrink.bpf.o";
        __u32 expect_sz;
        struct bpf_object *obj;
        int err, prog_fd;
 
 static void test_xdp_adjust_tail_grow(void)
 {
-       const char *file = "./test_xdp_adjust_tail_grow.o";
+       const char *file = "./test_xdp_adjust_tail_grow.bpf.o";
        struct bpf_object *obj;
        char buf[4096]; /* avoid segfault: large buf to hold grow results */
        __u32 expect_sz;
 
 static void test_xdp_adjust_tail_grow2(void)
 {
-       const char *file = "./test_xdp_adjust_tail_grow.o";
+       const char *file = "./test_xdp_adjust_tail_grow.bpf.o";
        char buf[4096]; /* avoid segfault: large buf to hold grow results */
        int tailroom = 320; /* SKB_DATA_ALIGN(sizeof(struct skb_shared_info))*/;
        struct bpf_object *obj;
 
 static void test_xdp_adjust_frags_tail_shrink(void)
 {
-       const char *file = "./test_xdp_adjust_tail_shrink.o";
+       const char *file = "./test_xdp_adjust_tail_shrink.bpf.o";
        __u32 exp_size;
        struct bpf_program *prog;
        struct bpf_object *obj;
 
 static void test_xdp_adjust_frags_tail_grow(void)
 {
-       const char *file = "./test_xdp_adjust_tail_grow.o";
+       const char *file = "./test_xdp_adjust_tail_grow.bpf.o";
        __u32 exp_size;
        struct bpf_program *prog;
        struct bpf_object *obj;
 
 {
        __u32 duration = 0, id1, id2, id0 = 0, len;
        struct bpf_object *obj1, *obj2, *obj3;
-       const char *file = "./test_xdp.o";
+       const char *file = "./test_xdp.bpf.o";
        struct bpf_prog_info info = {};
        int err, fd1, fd2, fd3;
        LIBBPF_OPTS(bpf_xdp_attach_opts, opts);
 
 void serial_test_xdp_info(void)
 {
        __u32 len = sizeof(struct bpf_prog_info), duration = 0, prog_id;
-       const char *file = "./xdp_dummy.o";
+       const char *file = "./xdp_dummy.bpf.o";
        struct bpf_prog_info info = {};
        struct bpf_object *obj;
        int err, prog_fd;
 
 
 void test_xdp_perf(void)
 {
-       const char *file = "./xdp_dummy.o";
+       const char *file = "./xdp_dummy.bpf.o";
        struct bpf_object *obj;
        char in[128], out[128];
        int err, prog_fd;
 
        SYS("ethtool -K tmp0 tx off");
        if (xdp)
                /* Workaround required for veth. */
-               SYS("ip link set tmp0 xdp object xdp_dummy.o section xdp 2> /dev/null");
+               SYS("ip link set tmp0 xdp object xdp_dummy.bpf.o section xdp 2> /dev/null");
 
        ns = open_netns("synproxy");
        if (!ASSERT_OK_PTR(ns, "setns"))
 
                              __builtin_preserve_access_index(&skb->len));
 
        ret = ctx->ret;
-       /* 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.
+       /* bpf_prog_test_load() loads "test_pkt_access.bpf.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.
         */
        ret = (__u32) ret;
        if (len != 74 || ret != 148)
 
 #include "cgroup_helpers.h"
 #include "testing_helpers.h"
 
-#define DEV_CGROUP_PROG "./dev_cgroup.o"
+#define DEV_CGROUP_PROG "./dev_cgroup.bpf.o"
 
 #define TEST_CGROUP "/test-bpf-based-device-cgroup/"
 
 
                return 2;
        }
 
-       ret = bpf_prog_test_load("test_lirc_mode2_kern.o",
+       ret = bpf_prog_test_load("test_lirc_mode2_kern.bpf.o",
                                 BPF_PROG_TYPE_LIRC_MODE2, &obj, &progfd);
        if (ret) {
                printf("Failed to load bpf program\n");
 
 #include <arpa/inet.h>
 #include <sys/select.h>
 #include <linux/err.h>
-#define SOCKMAP_PARSE_PROG "./sockmap_parse_prog.o"
-#define SOCKMAP_VERDICT_PROG "./sockmap_verdict_prog.o"
-#define SOCKMAP_TCP_MSG_PROG "./sockmap_tcp_msg_prog.o"
+#define SOCKMAP_PARSE_PROG "./sockmap_parse_prog.bpf.o"
+#define SOCKMAP_VERDICT_PROG "./sockmap_verdict_prog.bpf.o"
+#define SOCKMAP_TCP_MSG_PROG "./sockmap_tcp_msg_prog.bpf.o"
 static void test_sockmap(unsigned int tasks, void *data)
 {
        struct bpf_map *bpf_map_rx, *bpf_map_tx, *bpf_map_msg, *bpf_map_break;
        exit(1);
 }
 
-#define MAPINMAP_PROG "./test_map_in_map.o"
-#define MAPINMAP_INVALID_PROG "./test_map_in_map_invalid.o"
+#define MAPINMAP_PROG "./test_map_in_map.bpf.o"
+#define MAPINMAP_INVALID_PROG "./test_map_in_map_invalid.bpf.o"
 static void test_map_in_map(void)
 {
        struct bpf_object *obj;
 
     cmd("mount -t debugfs none /sys/kernel/debug")
 
 # Check samples are compiled
-samples = ["sample_ret0.o", "sample_map_ret0.o"]
+samples = ["sample_ret0.bpf.o", "sample_map_ret0.bpf.o"]
 for s in samples:
     ret, out = cmd("ls %s/%s" % (bpf_test_dir, s), fail=False)
     skip(ret != 0, "sample %s/%s not found, please compile it" %
 netns = []
 
 try:
-    obj = bpf_obj("sample_ret0.o")
+    obj = bpf_obj("sample_ret0.bpf.o")
     bytecode = bpf_bytecode("1,6 0 0 4294967295,")
 
     start_test("Test destruction of generic XDP...")
 
     sim.wait_for_flush()
     start_test("Test non-offload XDP attaching to HW...")
-    bpftool_prog_load("sample_ret0.o", "/sys/fs/bpf/nooffload")
+    bpftool_prog_load("sample_ret0.bpf.o", "/sys/fs/bpf/nooffload")
     nooffload = bpf_pinned("/sys/fs/bpf/nooffload")
     ret, _, err = sim.set_xdp(nooffload, "offload",
                               fail=False, include_stderr=True)
     rm("/sys/fs/bpf/nooffload")
 
     start_test("Test offload XDP attaching to drv...")
-    bpftool_prog_load("sample_ret0.o", "/sys/fs/bpf/offload",
+    bpftool_prog_load("sample_ret0.bpf.o", "/sys/fs/bpf/offload",
                       dev=sim['ifname'])
     offload = bpf_pinned("/sys/fs/bpf/offload")
     ret, _, err = sim.set_xdp(offload, "drv", fail=False, include_stderr=True)
 
     start_test("Test XDP load failure...")
     sim.dfs["dev/bpf_bind_verifier_accept"] = 0
-    ret, _, err = bpftool_prog_load("sample_ret0.o", "/sys/fs/bpf/offload",
+    ret, _, err = bpftool_prog_load("sample_ret0.bpf.o", "/sys/fs/bpf/offload",
                                  dev=sim['ifname'], fail=False, include_stderr=True)
     fail(ret == 0, "verifier should fail on load")
     check_verifier_log(err, "[netdevsim] Hello from netdevsim!")
 
     simdev = NetdevSimDev()
     sim, = simdev.nsims
-    map_obj = bpf_obj("sample_map_ret0.o")
+    map_obj = bpf_obj("sample_map_ret0.bpf.o")
     start_test("Test loading program with maps...")
     sim.set_xdp(map_obj, "offload", JSON=False) # map fixup msg breaks JSON
 
     sims = (simA, simB1, simB2, simB3)
     simB = (simB1, simB2, simB3)
 
-    bpftool_prog_load("sample_map_ret0.o", "/sys/fs/bpf/nsimA",
+    bpftool_prog_load("sample_map_ret0.bpf.o", "/sys/fs/bpf/nsimA",
                       dev=simA['ifname'])
     progA = bpf_pinned("/sys/fs/bpf/nsimA")
-    bpftool_prog_load("sample_map_ret0.o", "/sys/fs/bpf/nsimB",
+    bpftool_prog_load("sample_map_ret0.bpf.o", "/sys/fs/bpf/nsimB",
                       dev=simB1['ifname'])
     progB = bpf_pinned("/sys/fs/bpf/nsimB")
 
     mapA = bpftool("prog show %s" % (progA))[1]["map_ids"][0]
     mapB = bpftool("prog show %s" % (progB))[1]["map_ids"][0]
 
-    ret, _ = bpftool_prog_load("sample_map_ret0.o", "/sys/fs/bpf/nsimB_",
+    ret, _ = bpftool_prog_load("sample_map_ret0.bpf.o", "/sys/fs/bpf/nsimB_",
                                dev=simB3['ifname'],
                                maps=["idx 0 id %d" % (mapB)],
                                fail=False)
     fail(ret != 0, "couldn't reuse a map on the same ASIC")
     rm("/sys/fs/bpf/nsimB_")
 
-    ret, _, err = bpftool_prog_load("sample_map_ret0.o", "/sys/fs/bpf/nsimA_",
+    ret, _, err = bpftool_prog_load("sample_map_ret0.bpf.o", "/sys/fs/bpf/nsimA_",
                                     dev=simA['ifname'],
                                     maps=["idx 0 id %d" % (mapB)],
                                     fail=False, include_stderr=True)
     fail(err.count("offload device mismatch between prog and map") == 0,
          "error message missing for cross-ASIC map")
 
-    ret, _, err = bpftool_prog_load("sample_map_ret0.o", "/sys/fs/bpf/nsimB_",
+    ret, _, err = bpftool_prog_load("sample_map_ret0.bpf.o", "/sys/fs/bpf/nsimB_",
                                     dev=simB1['ifname'],
                                     maps=["idx 0 id %d" % (mapA)],
                                     fail=False, include_stderr=True)
 
 TEST_IF="test_cgid_1"
 TEST_IF_PEER="test_cgid_2"
 MAX_PING_TRIES=5
-BPF_PROG_OBJ="${DIR}/test_skb_cgroup_id_kern.o"
+BPF_PROG_OBJ="${DIR}/test_skb_cgroup_id_kern.bpf.o"
 BPF_PROG_SECTION="cgroup_id_logger"
 BPF_PROG_ID=0
 PROG="${DIR}/test_skb_cgroup_id_user"
 
 #endif
 
 #define CG_PATH        "/foo"
-#define CONNECT4_PROG_PATH     "./connect4_prog.o"
-#define CONNECT6_PROG_PATH     "./connect6_prog.o"
-#define SENDMSG4_PROG_PATH     "./sendmsg4_prog.o"
-#define SENDMSG6_PROG_PATH     "./sendmsg6_prog.o"
-#define RECVMSG4_PROG_PATH     "./recvmsg4_prog.o"
-#define RECVMSG6_PROG_PATH     "./recvmsg6_prog.o"
-#define BIND4_PROG_PATH                "./bind4_prog.o"
-#define BIND6_PROG_PATH                "./bind6_prog.o"
+#define CONNECT4_PROG_PATH     "./connect4_prog.bpf.o"
+#define CONNECT6_PROG_PATH     "./connect6_prog.bpf.o"
+#define SENDMSG4_PROG_PATH     "./sendmsg4_prog.bpf.o"
+#define SENDMSG6_PROG_PATH     "./sendmsg6_prog.bpf.o"
+#define RECVMSG4_PROG_PATH     "./recvmsg4_prog.bpf.o"
+#define RECVMSG6_PROG_PATH     "./recvmsg6_prog.bpf.o"
+#define BIND4_PROG_PATH                "./bind4_prog.bpf.o"
+#define BIND6_PROG_PATH                "./bind6_prog.bpf.o"
 
 #define SERV4_IP               "192.168.1.254"
 #define SERV4_REWRITE_IP       "127.0.0.1"
 
 #define S1_PORT 10000
 #define S2_PORT 10001
 
-#define BPF_SOCKMAP_FILENAME  "test_sockmap_kern.o"
-#define BPF_SOCKHASH_FILENAME "test_sockhash_kern.o"
+#define BPF_SOCKMAP_FILENAME  "test_sockmap_kern.bpf.o"
+#define BPF_SOCKHASH_FILENAME "test_sockhash_kern.bpf.o"
 #define CG_PATH "/sockmap"
 
 /* global sockets */
 
        },
        {
                "C prog: deny all writes",
-               .prog_file = "./test_sysctl_prog.o",
+               .prog_file = "./test_sysctl_prog.bpf.o",
                .attach_type = BPF_CGROUP_SYSCTL,
                .sysctl = "net/ipv4/tcp_mem",
                .open_flags = O_WRONLY,
        },
        {
                "C prog: deny access by name",
-               .prog_file = "./test_sysctl_prog.o",
+               .prog_file = "./test_sysctl_prog.bpf.o",
                .attach_type = BPF_CGROUP_SYSCTL,
                .sysctl = "net/ipv4/route/mtu_expires",
                .open_flags = O_RDONLY,
        },
        {
                "C prog: read tcp_mem",
-               .prog_file = "./test_sysctl_prog.o",
+               .prog_file = "./test_sysctl_prog.bpf.o",
                .attach_type = BPF_CGROUP_SYSCTL,
                .sysctl = "net/ipv4/tcp_mem",
                .open_flags = O_RDONLY,
 
 DIR=$(dirname $0)
 TEST_IF=lo
 MAX_PING_TRIES=5
-BPF_PROG_OBJ="${DIR}/test_tcp_check_syncookie_kern.o"
+BPF_PROG_OBJ="${DIR}/test_tcp_check_syncookie_kern.bpf.o"
 CLSACT_SECTION="tc"
 XDP_SECTION="xdp"
 BPF_PROG_ID=0
 
 
 int main(int argc, char **argv)
 {
-       const char *file = "test_tcpnotify_kern.o";
+       const char *file = "test_tcpnotify_kern.bpf.o";
        struct bpf_map *perf_map, *global_map;
        struct tcpnotify_globals g = {0};
        struct perf_buffer *pb = NULL;
 
                return 0
        fi
 
-       ip -n ${NS1} link set veth11 $xdpmode obj xdp_dummy.o sec xdp &> /dev/null
-       ip -n ${NS2} link set veth22 $xdpmode obj xdp_dummy.o sec xdp &> /dev/null
-       ip link set dev veth1 $xdpmode obj test_xdp_redirect.o sec redirect_to_222 &> /dev/null
-       ip link set dev veth2 $xdpmode obj test_xdp_redirect.o sec redirect_to_111 &> /dev/null
+       ip -n ${NS1} link set veth11 $xdpmode obj xdp_dummy.bpf.o sec xdp &> /dev/null
+       ip -n ${NS2} link set veth22 $xdpmode obj xdp_dummy.bpf.o sec xdp &> /dev/null
+       ip link set dev veth1 $xdpmode obj test_xdp_redirect.bpf.o sec redirect_to_222 &> /dev/null
+       ip link set dev veth2 $xdpmode obj test_xdp_redirect.bpf.o sec redirect_to_111 &> /dev/null
 
        if ip netns exec ${NS1} ping -c 1 10.1.1.22 &> /dev/null &&
           ip netns exec ${NS2} ping -c 1 10.1.1.11 &> /dev/null; then
 
                # Add a neigh entry for IPv4 ping test
                ip -n ${NS[$i]} neigh add 192.0.2.253 lladdr 00:00:00:00:00:01 dev veth0
                ip -n ${NS[$i]} link set veth0 $mode obj \
-                       xdp_dummy.o sec xdp &> /dev/null || \
+                       xdp_dummy.bpf.o sec xdp &> /dev/null || \
                        { test_fail "Unable to load dummy xdp" && exit 1; }
                IFACES="$IFACES veth$i"
                veth_mac[$i]=$(ip -n ${NS[0]} link show veth$i | awk '/link\/ether/ {print $2}')
 
 
 mkdir $BPF_DIR
 bpftool prog loadall \
-       xdp_redirect_map.o $BPF_DIR/progs type xdp \
+       xdp_redirect_map.bpf.o $BPF_DIR/progs type xdp \
        pinmaps $BPF_DIR/maps
 bpftool map update pinned $BPF_DIR/maps/tx_port key 0 0 0 0 value 122 0 0 0
 bpftool map update pinned $BPF_DIR/maps/tx_port key 1 0 0 0 value 133 0 0 0
 ip link set dev veth2 xdp pinned $BPF_DIR/progs/xdp_redirect_map_1
 ip link set dev veth3 xdp pinned $BPF_DIR/progs/xdp_redirect_map_2
 
-ip -n ${NS1} link set dev veth11 xdp obj xdp_dummy.o sec xdp
-ip -n ${NS2} link set dev veth22 xdp obj xdp_tx.o sec xdp
-ip -n ${NS3} link set dev veth33 xdp obj xdp_dummy.o sec xdp
+ip -n ${NS1} link set dev veth11 xdp obj xdp_dummy.bpf.o sec xdp
+ip -n ${NS2} link set dev veth22 xdp obj xdp_tx.bpf.o sec xdp
+ip -n ${NS3} link set dev veth33 xdp obj xdp_dummy.bpf.o sec xdp
 
 trap cleanup EXIT
 
 
        }
        printf("\n");
 
-       snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
+       snprintf(filename, sizeof(filename), "%s_kern.bpf.o", argv[0]);
        obj = bpf_object__open_file(filename, NULL);
        err = libbpf_get_error(obj);
        if (err)
 
        int prog_fd;
        int err;
 
-       snprintf(xdp_filename, sizeof(xdp_filename), "%s_kern.o", argv0);
+       snprintf(xdp_filename, sizeof(xdp_filename), "%s_kern.bpf.o", argv0);
        obj = bpf_object__open_file(xdp_filename, NULL);
        err = libbpf_get_error(obj);
        if (err < 0) {
 
        /* Use libbpf 1.0 API mode */
        libbpf_set_strict_mode(LIBBPF_STRICT_ALL);
 
-       snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
+       snprintf(filename, sizeof(filename), "%s_kern.bpf.o", argv[0]);
 
        if (bpf_prog_test_load(filename, BPF_PROG_TYPE_XDP, &obj, &prog_fd)) {
                fprintf(stderr, "load of %s failed\n", filename);