Lines Matching refs:sym

109 	const struct symbol *sym;
125 sh->sym = s;
159 struct symbol *sym;
161 elf_hash_for_each_possible(symbol, sym, hash, idx) {
162 if (sym->idx == idx)
163 return sym;
215 .sym = NULL,
230 if (!hole.sym)
233 /* @offset >= sym->offset + sym->len, find symbol after it */
234 n = rb_next(&hole.sym->node);
258 struct symbol *sym;
260 elf_hash_for_each_possible(symbol_name, sym, name_hash, str_hash(name)) {
261 if (!strcmp(sym->name, name))
262 return sym;
394 static void elf_add_symbol(struct elf *elf, struct symbol *sym)
400 INIT_LIST_HEAD(&sym->pv_target);
401 sym->alias = sym;
403 sym->type = GELF_ST_TYPE(sym->sym.st_info);
404 sym->bind = GELF_ST_BIND(sym->sym.st_info);
406 if (sym->type == STT_FILE)
409 sym->offset = sym->sym.st_value;
410 sym->len = sym->sym.st_size;
412 __sym_for_each(iter, &sym->sec->symbol_tree, sym->offset, sym->offset) {
413 if (iter->offset == sym->offset && iter->type == sym->type)
414 iter->alias = sym;
417 __sym_insert(sym, &sym->sec->symbol_tree);
418 pnode = rb_prev(&sym->node);
422 entry = &sym->sec->symbol_list;
423 list_add(&sym->list, entry);
424 elf_hash_add(symbol, &sym->hash, sym->idx);
425 elf_hash_add(symbol_name, &sym->name_hash, str_hash(sym->name));
431 if (!sym->len)
432 __sym_remove(sym, &sym->sec->symbol_tree);
438 struct symbol *sym, *pfunc;
465 elf->symbol_data = calloc(symbols_nr, sizeof(*sym));
471 sym = &elf->symbol_data[i];
473 sym->idx = i;
475 if (!gelf_getsymshndx(symtab->data, shndx_data, i, &sym->sym,
481 sym->name = elf_strptr(elf->elf, symtab->sh.sh_link,
482 sym->sym.st_name);
483 if (!sym->name) {
488 if ((sym->sym.st_shndx > SHN_UNDEF &&
489 sym->sym.st_shndx < SHN_LORESERVE) ||
490 (shndx_data && sym->sym.st_shndx == SHN_XINDEX)) {
491 if (sym->sym.st_shndx != SHN_XINDEX)
492 shndx = sym->sym.st_shndx;
494 sym->sec = find_section_by_index(elf, shndx);
495 if (!sym->sec) {
497 sym->name);
500 if (GELF_ST_TYPE(sym->sym.st_info) == STT_SECTION) {
501 sym->name = sym->sec->name;
502 sym->sec->sym = sym;
505 sym->sec = find_section_by_index(elf, 0);
507 elf_add_symbol(elf, sym);
517 sec_for_each_sym(sec, sym) {
520 if (sym->type != STT_FUNC)
523 if (sym->pfunc == NULL)
524 sym->pfunc = sym;
526 if (sym->cfunc == NULL)
527 sym->cfunc = sym;
529 coldstr = strstr(sym->name, ".cold");
533 pnamelen = coldstr - sym->name;
536 sym->name, MAX_NAME_LEN);
540 strncpy(pname, sym->name, pnamelen);
546 sym->name);
550 sym->pfunc = pfunc;
551 pfunc->cfunc = sym;
559 * pfunc->sym.st_size.
561 if (sym->sec == pfunc->sec &&
562 sym->offset >= pfunc->offset &&
563 sym->offset + sym->len == pfunc->offset + pfunc->len) {
564 pfunc->len -= sym->len;
572 free(sym);
577 * @sym's idx has changed. Update the relocs which reference it.
579 static int elf_update_sym_relocs(struct elf *elf, struct symbol *sym)
583 for (reloc = sym->relocs; reloc; reloc = reloc->sym_next_reloc)
584 set_reloc_sym(elf, reloc, reloc->sym->idx);
598 struct section *symtab_shndx, struct symbol *sym)
600 Elf32_Word shndx = sym->sec ? sym->sec->idx : SHN_UNDEF;
603 int max_idx, idx = sym->idx;
605 bool is_special_shndx = sym->sym.st_shndx >= SHN_LORESERVE &&
606 sym->sym.st_shndx != SHN_XINDEX;
609 shndx = sym->sym.st_shndx;
638 int num = max(1U, sym->idx/3);
708 sym->sym.st_shndx = shndx;
712 sym->sym.st_shndx = SHN_XINDEX;
719 if (!gelf_update_symshndx(symtab_data, shndx_data, idx, &sym->sym, shndx)) {
728 __elf_create_symbol(struct elf *elf, struct symbol *sym)
744 if (GELF_ST_BIND(sym->sym.st_info) != STB_LOCAL)
776 sym->idx = new_idx;
777 if (elf_update_symbol(elf, symtab, symtab_shndx, sym)) {
790 return sym;
796 struct symbol *sym = calloc(1, sizeof(*sym));
798 if (!sym) {
803 sym->name = sec->name;
804 sym->sec = sec;
807 sym->sym.st_info = GELF_ST_INFO(STB_LOCAL, STT_SECTION);
812 sym = __elf_create_symbol(elf, sym);
813 if (sym)
814 elf_add_symbol(elf, sym);
816 return sym;
824 struct symbol *sym = calloc(1, sizeof(*sym));
828 if (!sym || !name) {
835 sym->name = name;
836 sym->sec = orig->sec;
838 sym->sym.st_name = elf_add_string(elf, NULL, name);
839 sym->sym.st_info = orig->sym.st_info;
840 sym->sym.st_value = orig->sym.st_value - size;
841 sym->sym.st_size = size;
843 sym = __elf_create_symbol(elf, sym);
844 if (sym)
845 elf_add_symbol(elf, sym);
847 return sym;
852 unsigned long offset, struct symbol *sym,
872 reloc->sym = sym;
875 set_reloc_sym(elf, reloc, sym->idx);
880 reloc->sym_next_reloc = sym->relocs;
881 sym->relocs = reloc;
892 struct symbol *sym = insn_sec->sym;
897 __func__, sym->name);
901 if (!sym) {
908 sym = elf_create_section_symbol(elf, insn_sec);
909 if (!sym)
912 insn_sec->sym = sym;
915 return elf_init_reloc(elf, sec->rsec, reloc_idx, offset, sym, addend,
922 struct symbol *sym,
925 if (sym->sec && (sec->sh.sh_flags & SHF_EXECINSTR)) {
927 __func__, sym->name);
931 return elf_init_reloc(elf, sec->rsec, reloc_idx, offset, sym, addend,
941 struct symbol *sym;
971 reloc->sym = sym = find_symbol_by_index(elf, symndx);
972 if (!reloc->sym) {
979 reloc->sym_next_reloc = sym->relocs;
980 sym->relocs = reloc;