diff options
Diffstat (limited to 'tools/lib/bpf/libbpf.c')
-rw-r--r-- | tools/lib/bpf/libbpf.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 88609dca4f7d..b1f3ab4b39b3 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c | |||
@@ -207,7 +207,8 @@ static const char * const libbpf_type_to_btf_name[] = { | |||
207 | struct bpf_map { | 207 | struct bpf_map { |
208 | int fd; | 208 | int fd; |
209 | char *name; | 209 | char *name; |
210 | size_t offset; | 210 | int sec_idx; |
211 | size_t sec_offset; | ||
211 | int map_ifindex; | 212 | int map_ifindex; |
212 | int inner_map_fd; | 213 | int inner_map_fd; |
213 | struct bpf_map_def def; | 214 | struct bpf_map_def def; |
@@ -647,7 +648,9 @@ static int compare_bpf_map(const void *_a, const void *_b) | |||
647 | const struct bpf_map *a = _a; | 648 | const struct bpf_map *a = _a; |
648 | const struct bpf_map *b = _b; | 649 | const struct bpf_map *b = _b; |
649 | 650 | ||
650 | return a->offset - b->offset; | 651 | if (a->sec_idx != b->sec_idx) |
652 | return a->sec_idx - b->sec_idx; | ||
653 | return a->sec_offset - b->sec_offset; | ||
651 | } | 654 | } |
652 | 655 | ||
653 | static bool bpf_map_type__is_map_in_map(enum bpf_map_type type) | 656 | static bool bpf_map_type__is_map_in_map(enum bpf_map_type type) |
@@ -800,7 +803,7 @@ static struct bpf_map *bpf_object__add_map(struct bpf_object *obj) | |||
800 | 803 | ||
801 | static int | 804 | static int |
802 | bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type, | 805 | bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type, |
803 | Elf_Data *data, void **data_buff) | 806 | int sec_idx, Elf_Data *data, void **data_buff) |
804 | { | 807 | { |
805 | char map_name[BPF_OBJ_NAME_LEN]; | 808 | char map_name[BPF_OBJ_NAME_LEN]; |
806 | struct bpf_map_def *def; | 809 | struct bpf_map_def *def; |
@@ -811,7 +814,8 @@ bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type, | |||
811 | return PTR_ERR(map); | 814 | return PTR_ERR(map); |
812 | 815 | ||
813 | map->libbpf_type = type; | 816 | map->libbpf_type = type; |
814 | map->offset = ~(typeof(map->offset))0; | 817 | map->sec_idx = sec_idx; |
818 | map->sec_offset = 0; | ||
815 | snprintf(map_name, sizeof(map_name), "%.8s%.7s", obj->name, | 819 | snprintf(map_name, sizeof(map_name), "%.8s%.7s", obj->name, |
816 | libbpf_type_to_btf_name[type]); | 820 | libbpf_type_to_btf_name[type]); |
817 | map->name = strdup(map_name); | 821 | map->name = strdup(map_name); |
@@ -819,6 +823,8 @@ bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type, | |||
819 | pr_warning("failed to alloc map name\n"); | 823 | pr_warning("failed to alloc map name\n"); |
820 | return -ENOMEM; | 824 | return -ENOMEM; |
821 | } | 825 | } |
826 | pr_debug("map '%s' (global data): at sec_idx %d, offset %zu.\n", | ||
827 | map_name, map->sec_idx, map->sec_offset); | ||
822 | 828 | ||
823 | def = &map->def; | 829 | def = &map->def; |
824 | def->type = BPF_MAP_TYPE_ARRAY; | 830 | def->type = BPF_MAP_TYPE_ARRAY; |
@@ -851,6 +857,7 @@ static int bpf_object__init_global_data_maps(struct bpf_object *obj) | |||
851 | */ | 857 | */ |
852 | if (obj->efile.data_shndx >= 0) { | 858 | if (obj->efile.data_shndx >= 0) { |
853 | err = bpf_object__init_internal_map(obj, LIBBPF_MAP_DATA, | 859 | err = bpf_object__init_internal_map(obj, LIBBPF_MAP_DATA, |
860 | obj->efile.data_shndx, | ||
854 | obj->efile.data, | 861 | obj->efile.data, |
855 | &obj->sections.data); | 862 | &obj->sections.data); |
856 | if (err) | 863 | if (err) |
@@ -858,6 +865,7 @@ static int bpf_object__init_global_data_maps(struct bpf_object *obj) | |||
858 | } | 865 | } |
859 | if (obj->efile.rodata_shndx >= 0) { | 866 | if (obj->efile.rodata_shndx >= 0) { |
860 | err = bpf_object__init_internal_map(obj, LIBBPF_MAP_RODATA, | 867 | err = bpf_object__init_internal_map(obj, LIBBPF_MAP_RODATA, |
868 | obj->efile.rodata_shndx, | ||
861 | obj->efile.rodata, | 869 | obj->efile.rodata, |
862 | &obj->sections.rodata); | 870 | &obj->sections.rodata); |
863 | if (err) | 871 | if (err) |
@@ -865,6 +873,7 @@ static int bpf_object__init_global_data_maps(struct bpf_object *obj) | |||
865 | } | 873 | } |
866 | if (obj->efile.bss_shndx >= 0) { | 874 | if (obj->efile.bss_shndx >= 0) { |
867 | err = bpf_object__init_internal_map(obj, LIBBPF_MAP_BSS, | 875 | err = bpf_object__init_internal_map(obj, LIBBPF_MAP_BSS, |
876 | obj->efile.bss_shndx, | ||
868 | obj->efile.bss, NULL); | 877 | obj->efile.bss, NULL); |
869 | if (err) | 878 | if (err) |
870 | return err; | 879 | return err; |
@@ -948,7 +957,10 @@ static int bpf_object__init_user_maps(struct bpf_object *obj, bool strict) | |||
948 | } | 957 | } |
949 | 958 | ||
950 | map->libbpf_type = LIBBPF_MAP_UNSPEC; | 959 | map->libbpf_type = LIBBPF_MAP_UNSPEC; |
951 | map->offset = sym.st_value; | 960 | map->sec_idx = sym.st_shndx; |
961 | map->sec_offset = sym.st_value; | ||
962 | pr_debug("map '%s' (legacy): at sec_idx %d, offset %zu.\n", | ||
963 | map_name, map->sec_idx, map->sec_offset); | ||
952 | if (sym.st_value + map_def_sz > data->d_size) { | 964 | if (sym.st_value + map_def_sz > data->d_size) { |
953 | pr_warning("corrupted maps section in %s: last map \"%s\" too small\n", | 965 | pr_warning("corrupted maps section in %s: last map \"%s\" too small\n", |
954 | obj->path, map_name); | 966 | obj->path, map_name); |
@@ -1448,9 +1460,13 @@ bpf_program__collect_reloc(struct bpf_program *prog, GElf_Shdr *shdr, | |||
1448 | if (maps[map_idx].libbpf_type != type) | 1460 | if (maps[map_idx].libbpf_type != type) |
1449 | continue; | 1461 | continue; |
1450 | if (type != LIBBPF_MAP_UNSPEC || | 1462 | if (type != LIBBPF_MAP_UNSPEC || |
1451 | maps[map_idx].offset == sym.st_value) { | 1463 | (maps[map_idx].sec_idx == sym.st_shndx && |
1452 | pr_debug("relocation: find map %zd (%s) for insn %u\n", | 1464 | maps[map_idx].sec_offset == sym.st_value)) { |
1453 | map_idx, maps[map_idx].name, insn_idx); | 1465 | pr_debug("relocation: found map %zd (%s, sec_idx %d, offset %zu) for insn %u\n", |
1466 | map_idx, maps[map_idx].name, | ||
1467 | maps[map_idx].sec_idx, | ||
1468 | maps[map_idx].sec_offset, | ||
1469 | insn_idx); | ||
1454 | break; | 1470 | break; |
1455 | } | 1471 | } |
1456 | } | 1472 | } |
@@ -3468,13 +3484,7 @@ bpf_object__find_map_fd_by_name(struct bpf_object *obj, const char *name) | |||
3468 | struct bpf_map * | 3484 | struct bpf_map * |
3469 | bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset) | 3485 | bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset) |
3470 | { | 3486 | { |
3471 | int i; | 3487 | return ERR_PTR(-ENOTSUP); |
3472 | |||
3473 | for (i = 0; i < obj->nr_maps; i++) { | ||
3474 | if (obj->maps[i].offset == offset) | ||
3475 | return &obj->maps[i]; | ||
3476 | } | ||
3477 | return ERR_PTR(-ENOENT); | ||
3478 | } | 3488 | } |
3479 | 3489 | ||
3480 | long libbpf_get_error(const void *ptr) | 3490 | long libbpf_get_error(const void *ptr) |