struct bpf_map {
        int fd;
        char *name;
-       size_t offset;
+       int sec_idx;
+       size_t sec_offset;
        int map_ifindex;
        int inner_map_fd;
        struct bpf_map_def def;
        const struct bpf_map *a = _a;
        const struct bpf_map *b = _b;
 
-       return a->offset - b->offset;
+       if (a->sec_idx != b->sec_idx)
+               return a->sec_idx - b->sec_idx;
+       return a->sec_offset - b->sec_offset;
 }
 
 static bool bpf_map_type__is_map_in_map(enum bpf_map_type type)
 
 static int
 bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type,
-                             Elf_Data *data, void **data_buff)
+                             int sec_idx, Elf_Data *data, void **data_buff)
 {
        char map_name[BPF_OBJ_NAME_LEN];
        struct bpf_map_def *def;
                return PTR_ERR(map);
 
        map->libbpf_type = type;
-       map->offset = ~(typeof(map->offset))0;
+       map->sec_idx = sec_idx;
+       map->sec_offset = 0;
        snprintf(map_name, sizeof(map_name), "%.8s%.7s", obj->name,
                 libbpf_type_to_btf_name[type]);
        map->name = strdup(map_name);
                pr_warning("failed to alloc map name\n");
                return -ENOMEM;
        }
+       pr_debug("map '%s' (global data): at sec_idx %d, offset %zu.\n",
+                map_name, map->sec_idx, map->sec_offset);
 
        def = &map->def;
        def->type = BPF_MAP_TYPE_ARRAY;
         */
        if (obj->efile.data_shndx >= 0) {
                err = bpf_object__init_internal_map(obj, LIBBPF_MAP_DATA,
+                                                   obj->efile.data_shndx,
                                                    obj->efile.data,
                                                    &obj->sections.data);
                if (err)
        }
        if (obj->efile.rodata_shndx >= 0) {
                err = bpf_object__init_internal_map(obj, LIBBPF_MAP_RODATA,
+                                                   obj->efile.rodata_shndx,
                                                    obj->efile.rodata,
                                                    &obj->sections.rodata);
                if (err)
        }
        if (obj->efile.bss_shndx >= 0) {
                err = bpf_object__init_internal_map(obj, LIBBPF_MAP_BSS,
+                                                   obj->efile.bss_shndx,
                                                    obj->efile.bss, NULL);
                if (err)
                        return err;
                }
 
                map->libbpf_type = LIBBPF_MAP_UNSPEC;
-               map->offset = sym.st_value;
+               map->sec_idx = sym.st_shndx;
+               map->sec_offset = sym.st_value;
+               pr_debug("map '%s' (legacy): at sec_idx %d, offset %zu.\n",
+                        map_name, map->sec_idx, map->sec_offset);
                if (sym.st_value + map_def_sz > data->d_size) {
                        pr_warning("corrupted maps section in %s: last map \"%s\" too small\n",
                                   obj->path, map_name);
                                if (maps[map_idx].libbpf_type != type)
                                        continue;
                                if (type != LIBBPF_MAP_UNSPEC ||
-                                   maps[map_idx].offset == sym.st_value) {
-                                       pr_debug("relocation: find map %zd (%s) for insn %u\n",
-                                                map_idx, maps[map_idx].name, insn_idx);
+                                   (maps[map_idx].sec_idx == sym.st_shndx &&
+                                    maps[map_idx].sec_offset == sym.st_value)) {
+                                       pr_debug("relocation: found map %zd (%s, sec_idx %d, offset %zu) for insn %u\n",
+                                                map_idx, maps[map_idx].name,
+                                                maps[map_idx].sec_idx,
+                                                maps[map_idx].sec_offset,
+                                                insn_idx);
                                        break;
                                }
                        }
 struct bpf_map *
 bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset)
 {
-       int i;
-
-       for (i = 0; i < obj->nr_maps; i++) {
-               if (obj->maps[i].offset == offset)
-                       return &obj->maps[i];
-       }
-       return ERR_PTR(-ENOENT);
+       return ERR_PTR(-ENOTSUP);
 }
 
 long libbpf_get_error(const void *ptr)