Lines Matching refs:sym

155 	struct symbol *sym;  in find_symbol_by_index()  local
157 elf_hash_for_each_possible(elf->symbol_hash, sym, hash, idx) in find_symbol_by_index()
158 if (sym->idx == idx) in find_symbol_by_index()
159 return sym; in find_symbol_by_index()
222 struct symbol *sym; in find_symbol_by_name() local
224 elf_hash_for_each_possible(elf->symbol_name_hash, sym, name_hash, str_hash(name)) in find_symbol_by_name()
225 if (!strcmp(sym->name, name)) in find_symbol_by_name()
226 return sym; in find_symbol_by_name()
344 static void elf_add_symbol(struct elf *elf, struct symbol *sym) in elf_add_symbol() argument
349 sym->alias = sym; in elf_add_symbol()
351 sym->type = GELF_ST_TYPE(sym->sym.st_info); in elf_add_symbol()
352 sym->bind = GELF_ST_BIND(sym->sym.st_info); in elf_add_symbol()
354 sym->offset = sym->sym.st_value; in elf_add_symbol()
355 sym->len = sym->sym.st_size; in elf_add_symbol()
357 rb_add(&sym->sec->symbol_tree, &sym->node, symbol_to_offset); in elf_add_symbol()
358 pnode = rb_prev(&sym->node); in elf_add_symbol()
362 entry = &sym->sec->symbol_list; in elf_add_symbol()
363 list_add(&sym->list, entry); in elf_add_symbol()
364 elf_hash_add(elf->symbol_hash, &sym->hash, sym->idx); in elf_add_symbol()
365 elf_hash_add(elf->symbol_name_hash, &sym->name_hash, str_hash(sym->name)); in elf_add_symbol()
371 if (!sym->len) in elf_add_symbol()
372 rb_erase(&sym->node, &sym->sec->symbol_tree); in elf_add_symbol()
378 struct symbol *sym, *pfunc; in read_symbols() local
400 sym = malloc(sizeof(*sym)); in read_symbols()
401 if (!sym) { in read_symbols()
405 memset(sym, 0, sizeof(*sym)); in read_symbols()
407 sym->idx = i; in read_symbols()
409 if (!gelf_getsymshndx(symtab->data, shndx_data, i, &sym->sym, in read_symbols()
415 sym->name = elf_strptr(elf->elf, symtab->sh.sh_link, in read_symbols()
416 sym->sym.st_name); in read_symbols()
417 if (!sym->name) { in read_symbols()
422 if ((sym->sym.st_shndx > SHN_UNDEF && in read_symbols()
423 sym->sym.st_shndx < SHN_LORESERVE) || in read_symbols()
424 (shndx_data && sym->sym.st_shndx == SHN_XINDEX)) { in read_symbols()
425 if (sym->sym.st_shndx != SHN_XINDEX) in read_symbols()
426 shndx = sym->sym.st_shndx; in read_symbols()
428 sym->sec = find_section_by_index(elf, shndx); in read_symbols()
429 if (!sym->sec) { in read_symbols()
431 sym->name); in read_symbols()
434 if (GELF_ST_TYPE(sym->sym.st_info) == STT_SECTION) { in read_symbols()
435 sym->name = sym->sec->name; in read_symbols()
436 sym->sec->sym = sym; in read_symbols()
439 sym->sec = find_section_by_index(elf, 0); in read_symbols()
441 elf_add_symbol(elf, sym); in read_symbols()
449 list_for_each_entry(sym, &sec->symbol_list, list) { in read_symbols()
452 if (sym->type != STT_FUNC) in read_symbols()
455 if (sym->pfunc == NULL) in read_symbols()
456 sym->pfunc = sym; in read_symbols()
458 if (sym->cfunc == NULL) in read_symbols()
459 sym->cfunc = sym; in read_symbols()
461 coldstr = strstr(sym->name, ".cold"); in read_symbols()
465 pnamelen = coldstr - sym->name; in read_symbols()
468 sym->name, MAX_NAME_LEN); in read_symbols()
472 strncpy(pname, sym->name, pnamelen); in read_symbols()
478 sym->name); in read_symbols()
482 sym->pfunc = pfunc; in read_symbols()
483 pfunc->cfunc = sym; in read_symbols()
493 if (sym->sec == pfunc->sec && in read_symbols()
494 sym->offset >= pfunc->offset && in read_symbols()
495 sym->offset + sym->len == pfunc->offset + pfunc->len) { in read_symbols()
496 pfunc->len -= sym->len; in read_symbols()
504 free(sym); in read_symbols()
513 unsigned int type, struct symbol *sym, s64 addend) in elf_add_reloc() argument
530 reloc->sym = sym; in elf_add_reloc()
546 static void elf_dirty_reloc_sym(struct elf *elf, struct symbol *sym) in elf_dirty_reloc_sym() argument
557 if (reloc->sym == sym) { in elf_dirty_reloc_sym()
574 struct section *symtab_shndx, struct symbol *sym) in elf_update_symbol() argument
576 Elf32_Word shndx = sym->sec ? sym->sec->idx : SHN_UNDEF; in elf_update_symbol()
579 int max_idx, idx = sym->idx; in elf_update_symbol()
581 bool is_special_shndx = sym->sym.st_shndx >= SHN_LORESERVE && in elf_update_symbol()
582 sym->sym.st_shndx != SHN_XINDEX; in elf_update_symbol()
585 shndx = sym->sym.st_shndx; in elf_update_symbol()
637 shndx_data->d_buf = &sym->sec->idx; in elf_update_symbol()
672 sym->sym.st_shndx = shndx; in elf_update_symbol()
676 sym->sym.st_shndx = SHN_XINDEX; in elf_update_symbol()
683 if (!gelf_update_symshndx(symtab_data, shndx_data, idx, &sym->sym, shndx)) { in elf_update_symbol()
696 struct symbol *sym, *old; in elf_create_section_symbol() local
706 sym = calloc(1, sizeof(*sym)); in elf_create_section_symbol()
707 if (!sym) { in elf_create_section_symbol()
712 sym->name = sec->name; in elf_create_section_symbol()
713 sym->sec = sec; in elf_create_section_symbol()
716 sym->sym.st_info = GELF_ST_INFO(STB_LOCAL, STT_SECTION); in elf_create_section_symbol()
744 sym->idx = new_idx; in elf_create_section_symbol()
745 if (elf_update_symbol(elf, symtab, symtab_shndx, sym)) { in elf_create_section_symbol()
755 elf_add_symbol(elf, sym); in elf_create_section_symbol()
757 return sym; in elf_create_section_symbol()
764 struct symbol *sym = insn_sec->sym; in elf_add_reloc_to_insn() local
767 if (!sym) { in elf_add_reloc_to_insn()
774 sym = elf_create_section_symbol(elf, insn_sec); in elf_add_reloc_to_insn()
775 if (!sym) in elf_add_reloc_to_insn()
778 insn_sec->sym = sym; in elf_add_reloc_to_insn()
781 return elf_add_reloc(elf, sec, offset, type, sym, addend); in elf_add_reloc_to_insn()
854 reloc->sym = find_symbol_by_index(elf, symndx); in read_relocs()
855 if (!reloc->sym) { in read_relocs()
1154 relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rel_reloc_section()
1184 relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rela_reloc_section()
1231 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1239 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1300 struct symbol *sym, *tmpsym; in elf_close() local
1310 list_for_each_entry_safe(sym, tmpsym, &sec->symbol_list, list) { in elf_close()
1311 list_del(&sym->list); in elf_close()
1312 hash_del(&sym->hash); in elf_close()
1313 free(sym); in elf_close()