#include <asm/unistd.h>
 #include <linux/kernel.h>
 #include <linux/bpf.h>
+#include <linux/list.h>
 #include <libelf.h>
 #include <gelf.h>
 
        bpf_program_clear_priv_t clear_priv;
 };
 
+static LIST_HEAD(bpf_objects_list);
+
 struct bpf_object {
        char license[64];
        u32 kern_version;
                } *reloc;
                int nr_reloc;
        } efile;
+       /*
+        * All loaded bpf_object is linked in a list, which is
+        * hidden to caller. bpf_objects__<func> handlers deal with
+        * all objects.
+        */
+       struct list_head list;
        char path[];
 };
 #define obj_elf_valid(o)       ((o)->efile.elf)
        obj->efile.obj_buf_sz = obj_buf_sz;
 
        obj->loaded = false;
+
+       INIT_LIST_HEAD(&obj->list);
+       list_add(&obj->list, &bpf_objects_list);
        return obj;
 }
 
        }
        zfree(&obj->programs);
 
+       list_del(&obj->list);
        free(obj);
 }
 
+struct bpf_object *
+bpf_object__next(struct bpf_object *prev)
+{
+       struct bpf_object *next;
+
+       if (!prev)
+               next = list_first_entry(&bpf_objects_list,
+                                       struct bpf_object,
+                                       list);
+       else
+               next = list_next_entry(prev, list);
+
+       /* Empty list is noticed here so don't need checking on entry. */
+       if (&next->list == &bpf_objects_list)
+               return NULL;
+
+       return next;
+}
+
 struct bpf_program *
 bpf_program__next(struct bpf_program *prev, struct bpf_object *obj)
 {
 
 int bpf_object__load(struct bpf_object *obj);
 int bpf_object__unload(struct bpf_object *obj);
 
+struct bpf_object *bpf_object__next(struct bpf_object *prev);
+#define bpf_object__for_each_safe(pos, tmp)                    \
+       for ((pos) = bpf_object__next(NULL),            \
+               (tmp) = bpf_object__next(pos);          \
+            (pos) != NULL;                             \
+            (pos) = (tmp), (tmp) = bpf_object__next(tmp))
+
 /* Accessors of bpf_program. */
 struct bpf_program;
 struct bpf_program *bpf_program__next(struct bpf_program *prog,