Commit 5ad0ecbe authored by Eduard Zingerman's avatar Eduard Zingerman Committed by Andrii Nakryiko

libbpf: Struct_ops in SEC("?.struct_ops") / SEC("?.struct_ops.link")

Allow using two new section names for struct_ops maps:
- SEC("?.struct_ops")
- SEC("?.struct_ops.link")

To specify maps that have bpf_map->autocreate == false after open.
Signed-off-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240306104529.6453-12-eddyz87@gmail.com
parent 240bf8a5
...@@ -1322,6 +1322,15 @@ static int init_struct_ops_maps(struct bpf_object *obj, const char *sec_name, ...@@ -1322,6 +1322,15 @@ static int init_struct_ops_maps(struct bpf_object *obj, const char *sec_name,
return -ENOMEM; return -ENOMEM;
map->btf_value_type_id = type_id; map->btf_value_type_id = type_id;
/* Follow same convention as for programs autoload:
* SEC("?.struct_ops") means map is not created by default.
*/
if (sec_name[0] == '?') {
map->autocreate = false;
/* from now on forget there was ? in section name */
sec_name++;
}
map->def.type = BPF_MAP_TYPE_STRUCT_OPS; map->def.type = BPF_MAP_TYPE_STRUCT_OPS;
map->def.key_size = sizeof(int); map->def.key_size = sizeof(int);
map->def.value_size = type->size; map->def.value_size = type->size;
...@@ -3685,7 +3694,9 @@ static int bpf_object__elf_collect(struct bpf_object *obj) ...@@ -3685,7 +3694,9 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
sec_desc->shdr = sh; sec_desc->shdr = sh;
sec_desc->data = data; sec_desc->data = data;
} else if (strcmp(name, STRUCT_OPS_SEC) == 0 || } else if (strcmp(name, STRUCT_OPS_SEC) == 0 ||
strcmp(name, STRUCT_OPS_LINK_SEC) == 0) { strcmp(name, STRUCT_OPS_LINK_SEC) == 0 ||
strcmp(name, "?" STRUCT_OPS_SEC) == 0 ||
strcmp(name, "?" STRUCT_OPS_LINK_SEC) == 0) {
sec_desc->sec_type = SEC_ST_OPS; sec_desc->sec_type = SEC_ST_OPS;
sec_desc->shdr = sh; sec_desc->shdr = sh;
sec_desc->data = data; sec_desc->data = data;
...@@ -3705,6 +3716,8 @@ static int bpf_object__elf_collect(struct bpf_object *obj) ...@@ -3705,6 +3716,8 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
if (!section_have_execinstr(obj, targ_sec_idx) && if (!section_have_execinstr(obj, targ_sec_idx) &&
strcmp(name, ".rel" STRUCT_OPS_SEC) && strcmp(name, ".rel" STRUCT_OPS_SEC) &&
strcmp(name, ".rel" STRUCT_OPS_LINK_SEC) && strcmp(name, ".rel" STRUCT_OPS_LINK_SEC) &&
strcmp(name, ".rel?" STRUCT_OPS_SEC) &&
strcmp(name, ".rel?" STRUCT_OPS_LINK_SEC) &&
strcmp(name, ".rel" MAPS_ELF_SEC)) { strcmp(name, ".rel" MAPS_ELF_SEC)) {
pr_info("elf: skipping relo section(%d) %s for section(%d) %s\n", pr_info("elf: skipping relo section(%d) %s for section(%d) %s\n",
idx, name, targ_sec_idx, idx, name, targ_sec_idx,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment