Lines Matching +full:name +full:- +full:prefix
1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
8 * following name syntax:
14 * func - lookup BTF_KIND_FUNC symbol with <symbol> name
20 * struct - lookup BTF_KIND_STRUCT symbol with <symbol> name
26 * union - lookup BTF_KIND_UNION symbol with <symbol> name
32 * typedef - lookup BTF_KIND_TYPEDEF symbol with <symbol> name
38 * set - store symbol size into first 4 bytes and sort following
49 * set8 - store symbol size into first 4 bytes and sort following
79 #include <subcmd/parse-options.h>
103 char *name; member
173 static bool is_btf_id(const char *name) in is_btf_id() argument
175 return name && !strncmp(name, BTF_ID_PREFIX, sizeof(BTF_ID_PREFIX) - 1); in is_btf_id()
178 static struct btf_id *btf_id__find(struct rb_root *root, const char *name) in btf_id__find() argument
180 struct rb_node *p = root->rb_node; in btf_id__find()
186 cmp = strcmp(id->name, name); in btf_id__find()
188 p = p->rb_left; in btf_id__find()
190 p = p->rb_right; in btf_id__find()
198 btf_id__add(struct rb_root *root, char *name, bool unique) in btf_id__add() argument
200 struct rb_node **p = &root->rb_node; in btf_id__add()
208 cmp = strcmp(id->name, name); in btf_id__add()
210 p = &(*p)->rb_left; in btf_id__add()
212 p = &(*p)->rb_right; in btf_id__add()
219 pr_debug("adding symbol %s\n", name); in btf_id__add()
220 id->name = name; in btf_id__add()
221 rb_link_node(&id->rb_node, parent, p); in btf_id__add()
222 rb_insert_color(&id->rb_node, root); in btf_id__add()
235 int pos = sizeof("__") - 1; in get_id()
250 p--; in get_id()
260 static struct btf_id *add_set(struct object *obj, char *name, bool is_set8) in add_set() argument
264 * name = ^ in add_set()
267 char *id = name + (is_set8 ? sizeof(BTF_SET8 "__") : sizeof(BTF_SET "__")) - 1; in add_set()
268 int len = strlen(name); in add_set()
270 if (id >= name + len) { in add_set()
271 pr_err("FAILED to parse set name: %s\n", name); in add_set()
275 return btf_id__add(&obj->sets, id, true); in add_set()
278 static struct btf_id *add_symbol(struct rb_root *root, char *name, size_t size) in add_symbol() argument
282 id = get_id(name + size); in add_symbol()
284 pr_err("FAILED to parse symbol name: %s\n", name); in add_symbol()
310 if (!(sh->sh_flags & SHF_COMPRESSED)) in compressed_section_fix()
313 if (sh->sh_addralign == expected) in compressed_section_fix()
316 pr_debug2(" - fixing wrong alignment sh_addralign %u, expected %u\n", in compressed_section_fix()
317 sh->sh_addralign, expected); in compressed_section_fix()
319 sh->sh_addralign = expected; in compressed_section_fix()
323 elf_errmsg(-1)); in compressed_section_fix()
324 return -1; in compressed_section_fix()
338 fd = open(obj->path, O_RDWR, 0666); in elf_collect()
339 if (fd == -1) { in elf_collect()
341 obj->path, strerror(errno)); in elf_collect()
342 return -1; in elf_collect()
351 elf_errmsg(-1)); in elf_collect()
352 return -1; in elf_collect()
355 obj->efile.fd = fd; in elf_collect()
356 obj->efile.elf = elf; in elf_collect()
362 return -1; in elf_collect()
365 if (gelf_getehdr(obj->efile.elf, &ehdr) == NULL) { in elf_collect()
367 elf_errmsg(-1)); in elf_collect()
368 return -1; in elf_collect()
370 obj->efile.encoding = ehdr.e_ident[EI_DATA]; in elf_collect()
379 char *name; in elf_collect() local
384 return -1; in elf_collect()
387 name = elf_strptr(elf, shdrstrndx, sh.sh_name); in elf_collect()
388 if (!name) { in elf_collect()
389 pr_err("FAILED get section(%d) name\n", idx); in elf_collect()
390 return -1; in elf_collect()
396 idx, name); in elf_collect()
397 return -1; in elf_collect()
401 idx, name, (unsigned long) data->d_size, in elf_collect()
406 obj->efile.symbols = data; in elf_collect()
407 obj->efile.symbols_shndx = idx; in elf_collect()
408 obj->efile.strtabidx = sh.sh_link; in elf_collect()
409 } else if (!strcmp(name, BTF_IDS_SECTION)) { in elf_collect()
410 obj->efile.idlist = data; in elf_collect()
411 obj->efile.idlist_shndx = idx; in elf_collect()
412 obj->efile.idlist_addr = sh.sh_addr; in elf_collect()
413 } else if (!strcmp(name, BTF_BASE_ELF_SEC)) { in elf_collect()
420 obj->base_btf_path = NULL; in elf_collect()
424 return -1; in elf_collect()
435 char *name; in symbols_collect() local
437 scn = elf_getscn(obj->efile.elf, obj->efile.symbols_shndx); in symbols_collect()
439 return -1; in symbols_collect()
442 return -1; in symbols_collect()
451 char *prefix; in symbols_collect() local
455 if (!gelf_getsym(obj->efile.symbols, i, &sym)) in symbols_collect()
456 return -1; in symbols_collect()
458 if (sym.st_shndx != obj->efile.idlist_shndx) in symbols_collect()
461 name = elf_strptr(obj->efile.elf, obj->efile.strtabidx, in symbols_collect()
464 if (!is_btf_id(name)) in symbols_collect()
469 * prefix = ^ in symbols_collect()
471 prefix = name + sizeof(BTF_ID_PREFIX) - 1; in symbols_collect()
474 if (!strncmp(prefix, BTF_STRUCT, sizeof(BTF_STRUCT) - 1)) { in symbols_collect()
475 obj->nr_structs++; in symbols_collect()
476 id = add_symbol(&obj->structs, prefix, sizeof(BTF_STRUCT) - 1); in symbols_collect()
478 } else if (!strncmp(prefix, BTF_UNION, sizeof(BTF_UNION) - 1)) { in symbols_collect()
479 obj->nr_unions++; in symbols_collect()
480 id = add_symbol(&obj->unions, prefix, sizeof(BTF_UNION) - 1); in symbols_collect()
482 } else if (!strncmp(prefix, BTF_TYPEDEF, sizeof(BTF_TYPEDEF) - 1)) { in symbols_collect()
483 obj->nr_typedefs++; in symbols_collect()
484 id = add_symbol(&obj->typedefs, prefix, sizeof(BTF_TYPEDEF) - 1); in symbols_collect()
486 } else if (!strncmp(prefix, BTF_FUNC, sizeof(BTF_FUNC) - 1)) { in symbols_collect()
487 obj->nr_funcs++; in symbols_collect()
488 id = add_symbol(&obj->funcs, prefix, sizeof(BTF_FUNC) - 1); in symbols_collect()
490 } else if (!strncmp(prefix, BTF_SET8, sizeof(BTF_SET8) - 1)) { in symbols_collect()
491 id = add_set(obj, prefix, true); in symbols_collect()
495 * that - 1. in symbols_collect()
498 id->cnt = sym.st_size / sizeof(uint64_t) - 1; in symbols_collect()
499 id->is_set8 = true; in symbols_collect()
502 } else if (!strncmp(prefix, BTF_SET, sizeof(BTF_SET) - 1)) { in symbols_collect()
503 id = add_set(obj, prefix, false); in symbols_collect()
507 * that - 1. in symbols_collect()
510 id->cnt = sym.st_size / sizeof(int) - 1; in symbols_collect()
511 id->is_set = true; in symbols_collect()
514 pr_err("FAILED unsupported prefix %s\n", prefix); in symbols_collect()
515 return -1; in symbols_collect()
519 return -ENOMEM; in symbols_collect()
521 if (id->addr_cnt >= ADDR_CNT) { in symbols_collect()
523 id->name); in symbols_collect()
524 return -1; in symbols_collect()
526 id->addr[id->addr_cnt++] = sym.st_value; in symbols_collect()
534 int nr_typedefs = obj->nr_typedefs; in symbols_resolve()
535 int nr_structs = obj->nr_structs; in symbols_resolve()
536 int nr_unions = obj->nr_unions; in symbols_resolve()
537 int nr_funcs = obj->nr_funcs; in symbols_resolve()
543 if (obj->base_btf_path) { in symbols_resolve()
544 base_btf = btf__parse(obj->base_btf_path, NULL); in symbols_resolve()
548 obj->base_btf_path, strerror(-err)); in symbols_resolve()
549 return -1; in symbols_resolve()
553 btf = btf__parse_split(obj->btf ?: obj->path, base_btf); in symbols_resolve()
557 obj->btf ?: obj->path, strerror(-err)); in symbols_resolve()
561 err = -1; in symbols_resolve()
583 root = &obj->funcs; in symbols_resolve()
586 root = &obj->structs; in symbols_resolve()
589 root = &obj->unions; in symbols_resolve()
592 root = &obj->typedefs; in symbols_resolve()
596 str = btf__name_by_offset(btf, type->name_off); in symbols_resolve()
598 pr_err("FAILED: malformed BTF, can't resolve name for ID %d\n", in symbols_resolve()
605 if (id->id) { in symbols_resolve()
606 pr_info("WARN: multiple IDs found for '%s': %d, %d - using %d\n", in symbols_resolve()
607 str, id->id, type_id, id->id); in symbols_resolve()
610 id->id = type_id; in symbols_resolve()
611 (*nr)--; in symbols_resolve()
625 Elf_Data *data = obj->efile.idlist; in id_patch()
626 int *ptr = data->d_buf; in id_patch()
629 /* For set, set8, id->id may be 0 */ in id_patch()
630 if (!id->id && !id->is_set && !id->is_set8) { in id_patch()
631 pr_err("WARN: resolve_btfids: unresolved symbol %s\n", id->name); in id_patch()
635 for (i = 0; i < id->addr_cnt; i++) { in id_patch()
636 unsigned long addr = id->addr[i]; in id_patch()
637 unsigned long idx = addr - obj->efile.idlist_addr; in id_patch()
640 idx, id->id, id->name); in id_patch()
642 if (idx >= data->d_size) { in id_patch()
644 idx, data->d_size); in id_patch()
645 return -1; in id_patch()
649 ptr[idx] = id->id; in id_patch()
665 return -1; in __symbols_patch()
676 return *a - *b; in cmp_id()
681 Elf_Data *data = obj->efile.idlist; in sets_patch()
684 next = rb_first(&obj->sets); in sets_patch()
692 addr = id->addr[0]; in sets_patch()
693 off = addr - obj->efile.idlist_addr; in sets_patch()
696 if (id->addr_cnt != 1) { in sets_patch()
698 id->name); in sets_patch()
699 return -1; in sets_patch()
702 if (id->is_set) { in sets_patch()
703 set = data->d_buf + off; in sets_patch()
704 qsort(set->ids, set->cnt, sizeof(set->ids[0]), cmp_id); in sets_patch()
706 set8 = data->d_buf + off; in sets_patch()
711 BUILD_BUG_ON((u32 *)set8->pairs != &set8->pairs[0].id); in sets_patch()
712 qsort(set8->pairs, set8->cnt, sizeof(set8->pairs[0]), cmp_id); in sets_patch()
722 if (obj->efile.encoding != ELFDATANATIVE) { in sets_patch()
725 set8->flags = bswap_32(set8->flags); in sets_patch()
726 for (i = 0; i < set8->cnt; i++) { in sets_patch()
727 set8->pairs[i].flags = in sets_patch()
728 bswap_32(set8->pairs[i].flags); in sets_patch()
734 off, id->is_set ? set->cnt : set8->cnt, id->name); in sets_patch()
745 if (__symbols_patch(obj, &obj->structs) || in symbols_patch()
746 __symbols_patch(obj, &obj->unions) || in symbols_patch()
747 __symbols_patch(obj, &obj->typedefs) || in symbols_patch()
748 __symbols_patch(obj, &obj->funcs) || in symbols_patch()
749 __symbols_patch(obj, &obj->sets)) in symbols_patch()
750 return -1; in symbols_patch()
753 return -1; in symbols_patch()
756 obj->efile.idlist->d_type = ELF_T_WORD; in symbols_patch()
758 elf_flagdata(obj->efile.idlist, ELF_C_SET, ELF_F_DIRTY); in symbols_patch()
760 err = elf_update(obj->efile.elf, ELF_C_WRITE); in symbols_patch()
763 elf_errmsg(-1)); in symbols_patch()
767 err >= 0 ? "ok" : "failed", obj->path); in symbols_patch()
768 return err < 0 ? -1 : 0; in symbols_patch()
780 .idlist_shndx = -1, in main()
781 .symbols_shndx = -1, in main()
801 int err = -1; in main()
817 if (obj.efile.idlist_shndx == -1 || in main()
818 obj.efile.symbols_shndx == -1) { in main()