Lines Matching refs:sym

107 	const struct symbol *sym;  member
123 sh->sym = s; in symbol_hole_by_offset()
157 struct symbol *sym; in find_symbol_by_index() local
159 elf_hash_for_each_possible(symbol, sym, hash, idx) { in find_symbol_by_index()
160 if (sym->idx == idx) in find_symbol_by_index()
161 return sym; in find_symbol_by_index()
213 .sym = NULL, in find_symbol_hole_containing()
233 if (hole.sym) in find_symbol_hole_containing()
234 n = rb_next(&hole.sym->node); in find_symbol_hole_containing()
261 struct symbol *sym; in find_symbol_by_name() local
263 elf_hash_for_each_possible(symbol_name, sym, name_hash, str_hash(name)) { in find_symbol_by_name()
264 if (!strcmp(sym->name, name)) in find_symbol_by_name()
265 return sym; in find_symbol_by_name()
396 static void elf_add_symbol(struct elf *elf, struct symbol *sym) in elf_add_symbol() argument
402 INIT_LIST_HEAD(&sym->pv_target); in elf_add_symbol()
403 sym->alias = sym; in elf_add_symbol()
405 sym->type = GELF_ST_TYPE(sym->sym.st_info); in elf_add_symbol()
406 sym->bind = GELF_ST_BIND(sym->sym.st_info); in elf_add_symbol()
408 if (sym->type == STT_FILE) in elf_add_symbol()
411 sym->offset = sym->sym.st_value; in elf_add_symbol()
412 sym->len = sym->sym.st_size; in elf_add_symbol()
414 __sym_for_each(iter, &sym->sec->symbol_tree, sym->offset, sym->offset) { in elf_add_symbol()
415 if (iter->offset == sym->offset && iter->type == sym->type) in elf_add_symbol()
416 iter->alias = sym; in elf_add_symbol()
419 __sym_insert(sym, &sym->sec->symbol_tree); in elf_add_symbol()
420 pnode = rb_prev(&sym->node); in elf_add_symbol()
424 entry = &sym->sec->symbol_list; in elf_add_symbol()
425 list_add(&sym->list, entry); in elf_add_symbol()
426 elf_hash_add(symbol, &sym->hash, sym->idx); in elf_add_symbol()
427 elf_hash_add(symbol_name, &sym->name_hash, str_hash(sym->name)); in elf_add_symbol()
433 if (!sym->len) in elf_add_symbol()
434 __sym_remove(sym, &sym->sec->symbol_tree); in elf_add_symbol()
440 struct symbol *sym, *pfunc; in read_symbols() local
467 elf->symbol_data = calloc(symbols_nr, sizeof(*sym)); in read_symbols()
473 sym = &elf->symbol_data[i]; in read_symbols()
475 sym->idx = i; in read_symbols()
477 if (!gelf_getsymshndx(symtab->data, shndx_data, i, &sym->sym, in read_symbols()
483 sym->name = elf_strptr(elf->elf, symtab->sh.sh_link, in read_symbols()
484 sym->sym.st_name); in read_symbols()
485 if (!sym->name) { in read_symbols()
490 if ((sym->sym.st_shndx > SHN_UNDEF && in read_symbols()
491 sym->sym.st_shndx < SHN_LORESERVE) || in read_symbols()
492 (shndx_data && sym->sym.st_shndx == SHN_XINDEX)) { in read_symbols()
493 if (sym->sym.st_shndx != SHN_XINDEX) in read_symbols()
494 shndx = sym->sym.st_shndx; in read_symbols()
496 sym->sec = find_section_by_index(elf, shndx); in read_symbols()
497 if (!sym->sec) { in read_symbols()
498 ERROR("couldn't find section for symbol %s", sym->name); in read_symbols()
501 if (GELF_ST_TYPE(sym->sym.st_info) == STT_SECTION) { in read_symbols()
502 sym->name = sym->sec->name; in read_symbols()
503 sym->sec->sym = sym; in read_symbols()
506 sym->sec = find_section_by_index(elf, 0); in read_symbols()
508 elf_add_symbol(elf, sym); in read_symbols()
518 sec_for_each_sym(sec, sym) { in read_symbols()
521 if (sym->type != STT_FUNC) in read_symbols()
524 if (sym->pfunc == NULL) in read_symbols()
525 sym->pfunc = sym; in read_symbols()
527 if (sym->cfunc == NULL) in read_symbols()
528 sym->cfunc = sym; in read_symbols()
530 coldstr = strstr(sym->name, ".cold"); in read_symbols()
534 pnamelen = coldstr - sym->name; in read_symbols()
535 pname = strndup(sym->name, pnamelen); in read_symbols()
537 ERROR("%s(): failed to allocate memory", sym->name); in read_symbols()
545 ERROR("%s(): can't find parent function", sym->name); in read_symbols()
549 sym->pfunc = pfunc; in read_symbols()
550 pfunc->cfunc = sym; in read_symbols()
560 if (sym->sec == pfunc->sec && in read_symbols()
561 sym->offset >= pfunc->offset && in read_symbols()
562 sym->offset + sym->len == pfunc->offset + pfunc->len) { in read_symbols()
563 pfunc->len -= sym->len; in read_symbols()
571 free(sym); in read_symbols()
578 struct symbol *sym; in mark_group_syms() local
589 sym = find_symbol_by_index(elf, sec->sh.sh_info); in mark_group_syms()
590 if (!sym) { in mark_group_syms()
596 sym->group_sec = sec; in mark_group_syms()
606 static int elf_update_sym_relocs(struct elf *elf, struct symbol *sym) in elf_update_sym_relocs() argument
610 for (reloc = sym->relocs; reloc; reloc = sym_next_reloc(reloc)) in elf_update_sym_relocs()
611 set_reloc_sym(elf, reloc, reloc->sym->idx); in elf_update_sym_relocs()
625 struct section *symtab_shndx, struct symbol *sym) in elf_update_symbol() argument
627 Elf32_Word shndx = sym->sec ? sym->sec->idx : SHN_UNDEF; in elf_update_symbol()
630 int max_idx, idx = sym->idx; in elf_update_symbol()
632 bool is_special_shndx = sym->sym.st_shndx >= SHN_LORESERVE && in elf_update_symbol()
633 sym->sym.st_shndx != SHN_XINDEX; in elf_update_symbol()
636 shndx = sym->sym.st_shndx; in elf_update_symbol()
665 int num = max(1U, sym->idx/3); in elf_update_symbol()
735 sym->sym.st_shndx = shndx; in elf_update_symbol()
739 sym->sym.st_shndx = SHN_XINDEX; in elf_update_symbol()
746 if (!gelf_update_symshndx(symtab_data, shndx_data, idx, &sym->sym, shndx)) { in elf_update_symbol()
755 __elf_create_symbol(struct elf *elf, struct symbol *sym) in __elf_create_symbol() argument
771 if (GELF_ST_BIND(sym->sym.st_info) != STB_LOCAL) in __elf_create_symbol()
808 sym->idx = new_idx; in __elf_create_symbol()
809 if (elf_update_symbol(elf, symtab, symtab_shndx, sym)) { in __elf_create_symbol()
822 return sym; in __elf_create_symbol()
828 struct symbol *sym = calloc(1, sizeof(*sym)); in elf_create_section_symbol() local
830 if (!sym) { in elf_create_section_symbol()
835 sym->name = sec->name; in elf_create_section_symbol()
836 sym->sec = sec; in elf_create_section_symbol()
839 sym->sym.st_info = GELF_ST_INFO(STB_LOCAL, STT_SECTION); in elf_create_section_symbol()
844 sym = __elf_create_symbol(elf, sym); in elf_create_section_symbol()
845 if (sym) in elf_create_section_symbol()
846 elf_add_symbol(elf, sym); in elf_create_section_symbol()
848 return sym; in elf_create_section_symbol()
856 struct symbol *sym = calloc(1, sizeof(*sym)); in elf_create_prefix_symbol() local
860 if (!sym || !name) { in elf_create_prefix_symbol()
867 sym->name = name; in elf_create_prefix_symbol()
868 sym->sec = orig->sec; in elf_create_prefix_symbol()
870 sym->sym.st_name = elf_add_string(elf, NULL, name); in elf_create_prefix_symbol()
871 sym->sym.st_info = orig->sym.st_info; in elf_create_prefix_symbol()
872 sym->sym.st_value = orig->sym.st_value - size; in elf_create_prefix_symbol()
873 sym->sym.st_size = size; in elf_create_prefix_symbol()
875 sym = __elf_create_symbol(elf, sym); in elf_create_prefix_symbol()
876 if (sym) in elf_create_prefix_symbol()
877 elf_add_symbol(elf, sym); in elf_create_prefix_symbol()
879 return sym; in elf_create_prefix_symbol()
884 unsigned long offset, struct symbol *sym, in elf_init_reloc() argument
904 reloc->sym = sym; in elf_init_reloc()
907 set_reloc_sym(elf, reloc, sym->idx); in elf_init_reloc()
912 set_sym_next_reloc(reloc, sym->relocs); in elf_init_reloc()
913 sym->relocs = reloc; in elf_init_reloc()
924 struct symbol *sym = insn_sec->sym; in elf_init_reloc_text_sym() local
928 ERROR("bad call to %s() for data symbol %s", __func__, sym->name); in elf_init_reloc_text_sym()
932 if (!sym) { in elf_init_reloc_text_sym()
939 sym = elf_create_section_symbol(elf, insn_sec); in elf_init_reloc_text_sym()
940 if (!sym) in elf_init_reloc_text_sym()
943 insn_sec->sym = sym; in elf_init_reloc_text_sym()
946 return elf_init_reloc(elf, sec->rsec, reloc_idx, offset, sym, addend, in elf_init_reloc_text_sym()
953 struct symbol *sym, in elf_init_reloc_data_sym() argument
956 if (sym->sec && (sec->sh.sh_flags & SHF_EXECINSTR)) { in elf_init_reloc_data_sym()
957 ERROR("bad call to %s() for text symbol %s", __func__, sym->name); in elf_init_reloc_data_sym()
961 return elf_init_reloc(elf, sec->rsec, reloc_idx, offset, sym, addend, in elf_init_reloc_data_sym()
971 struct symbol *sym; in read_relocs() local
1000 reloc->sym = sym = find_symbol_by_index(elf, symndx); in read_relocs()
1001 if (!reloc->sym) { in read_relocs()
1007 set_sym_next_reloc(reloc, sym->relocs); in read_relocs()
1008 sym->relocs = reloc; in read_relocs()