static int populate_skeleton_maps(const struct bpf_object *obj,
                                  struct bpf_map_skeleton *maps,
-                                 size_t map_cnt)
+                                 size_t map_cnt, size_t map_skel_sz)
 {
        int i;
 
        for (i = 0; i < map_cnt; i++) {
-               struct bpf_map **map = maps[i].map;
-               const char *name = maps[i].name;
-               void **mmaped = maps[i].mmaped;
+               struct bpf_map_skeleton *map_skel = (void *)maps + i * map_skel_sz;
+               struct bpf_map **map = map_skel->map;
+               const char *name = map_skel->name;
+               void **mmaped = map_skel->mmaped;
 
                *map = bpf_object__find_map_by_name(obj, name);
                if (!*map) {
 
 static int populate_skeleton_progs(const struct bpf_object *obj,
                                   struct bpf_prog_skeleton *progs,
-                                  size_t prog_cnt)
+                                  size_t prog_cnt, size_t prog_skel_sz)
 {
        int i;
 
        for (i = 0; i < prog_cnt; i++) {
-               struct bpf_program **prog = progs[i].prog;
-               const char *name = progs[i].name;
+               struct bpf_prog_skeleton *prog_skel = (void *)progs + i * prog_skel_sz;
+               struct bpf_program **prog = prog_skel->prog;
+               const char *name = prog_skel->name;
 
                *prog = bpf_object__find_program_by_name(obj, name);
                if (!*prog) {
        }
 
        *s->obj = obj;
-       err = populate_skeleton_maps(obj, s->maps, s->map_cnt);
+       err = populate_skeleton_maps(obj, s->maps, s->map_cnt, s->map_skel_sz);
        if (err) {
                pr_warn("failed to populate skeleton maps for '%s': %d\n", s->name, err);
                return libbpf_err(err);
        }
 
-       err = populate_skeleton_progs(obj, s->progs, s->prog_cnt);
+       err = populate_skeleton_progs(obj, s->progs, s->prog_cnt, s->prog_skel_sz);
        if (err) {
                pr_warn("failed to populate skeleton progs for '%s': %d\n", s->name, err);
                return libbpf_err(err);
                return libbpf_err(-errno);
        }
 
-       err = populate_skeleton_maps(s->obj, s->maps, s->map_cnt);
+       err = populate_skeleton_maps(s->obj, s->maps, s->map_cnt, s->map_skel_sz);
        if (err) {
                pr_warn("failed to populate subskeleton maps: %d\n", err);
                return libbpf_err(err);
        }
 
-       err = populate_skeleton_progs(s->obj, s->progs, s->prog_cnt);
+       err = populate_skeleton_progs(s->obj, s->progs, s->prog_cnt, s->prog_skel_sz);
        if (err) {
                pr_warn("failed to populate subskeleton maps: %d\n", err);
                return libbpf_err(err);
        }
 
        for (var_idx = 0; var_idx < s->var_cnt; var_idx++) {
-               var_skel = &s->vars[var_idx];
+               var_skel = (void *)s->vars + var_idx * s->var_skel_sz;
                map = *var_skel->map;
                map_type_id = bpf_map__btf_value_type_id(map);
                map_type = btf__type_by_id(btf, map_type_id);
        }
 
        for (i = 0; i < s->map_cnt; i++) {
-               struct bpf_map *map = *s->maps[i].map;
+               struct bpf_map_skeleton *map_skel = (void *)s->maps + i * s->map_skel_sz;
+               struct bpf_map *map = *map_skel->map;
                size_t mmap_sz = bpf_map_mmap_sz(map);
                int prot, map_fd = map->fd;
-               void **mmaped = s->maps[i].mmaped;
+               void **mmaped = map_skel->mmaped;
 
                if (!mmaped)
                        continue;
        int i, err;
 
        for (i = 0; i < s->prog_cnt; i++) {
-               struct bpf_program *prog = *s->progs[i].prog;
-               struct bpf_link **link = s->progs[i].link;
+               struct bpf_prog_skeleton *prog_skel = (void *)s->progs + i * s->prog_skel_sz;
+               struct bpf_program *prog = *prog_skel->prog;
+               struct bpf_link **link = prog_skel->link;
 
                if (!prog->autoload || !prog->autoattach)
                        continue;
                return 0;
 
        for (i = 0; i < s->map_cnt; i++) {
-               struct bpf_map *map = *s->maps[i].map;
-               struct bpf_link **link = s->maps[i].link;
+               struct bpf_map_skeleton *map_skel = (void *)s->maps + i * s->map_skel_sz;
+               struct bpf_map *map = *map_skel->map;
+               struct bpf_link **link = map_skel->link;
 
                if (!map->autocreate || !map->autoattach)
                        continue;
        int i;
 
        for (i = 0; i < s->prog_cnt; i++) {
-               struct bpf_link **link = s->progs[i].link;
+               struct bpf_prog_skeleton *prog_skel = (void *)s->progs + i * s->prog_skel_sz;
+               struct bpf_link **link = prog_skel->link;
 
                bpf_link__destroy(*link);
                *link = NULL;
                return;
 
        for (i = 0; i < s->map_cnt; i++) {
-               struct bpf_link **link = s->maps[i].link;
+               struct bpf_map_skeleton *map_skel = (void *)s->maps + i * s->map_skel_sz;
+               struct bpf_link **link = map_skel->link;
 
                if (link) {
                        bpf_link__destroy(*link);