const char * Elf_demangle_name(const char *name) { if (DBG_ISDEMANGLE()) return (conv_demangle_name(name)); return (name); }
/* * Define name demanglers. */ const char * Dbg_demangle_name(const char *name) { if (DBG_NOTCLASS(DBG_C_DEMANGLE)) return (name); return (conv_demangle_name(name)); }
/* * Translate symbol table data particularly for sorting. * Input is the symbol table data structure, number of symbols, * opened ELF file, and the string table link offset. */ static SYM * readsyms(Elf_Data * data, GElf_Sxword num, Elf *elf, unsigned int link, unsigned int symscnndx) { SYM *s, *buf; GElf_Sym sym; Elf32_Word *symshndx = 0; unsigned int nosymshndx = 0; int i; if ((buf = calloc(num, sizeof (SYM))) == NULL) { (void) fprintf(stderr, gettext("%s: cannot allocate memory\n"), prog_name); return (NULL); } s = buf; /* save pointer to head of array */ for (i = 1; i < num; i++, buf++) { (void) gelf_getsym(data, i, &sym); buf->indx = i; /* allow to work on machines where NULL-derefs dump core */ if (sym.st_name == 0) buf->name = ""; else if (C_flag) { const char *dn; char *name = (char *)elf_strptr(elf, link, sym.st_name); dn = conv_demangle_name(name); if (strcmp(dn, name) == 0) { /* Not demangled */ if (exotic(name)) { name = FormatName(name, d_buf); } } else { /* name demangled */ name = FormatName(name, dn); } buf->name = name; } else buf->name = (char *)elf_strptr(elf, link, sym.st_name); buf->value = sym.st_value; buf->size = sym.st_size; buf->type = GELF_ST_TYPE(sym.st_info); buf->bind = GELF_ST_BIND(sym.st_info); buf->other = sym.st_other; if ((sym.st_shndx == SHN_XINDEX) && (symshndx == 0) && (nosymshndx == 0)) { Elf_Scn *_scn; GElf_Shdr _shdr; _scn = 0; while ((_scn = elf_nextscn(elf, _scn)) != 0) { if (gelf_getshdr(_scn, &_shdr) == 0) break; if ((_shdr.sh_type == SHT_SYMTAB_SHNDX) && (_shdr.sh_link == symscnndx)) { Elf_Data *_data; if ((_data = elf_getdata(_scn, 0)) != 0) { symshndx = (Elf32_Word *)_data->d_buf; break; } } } nosymshndx = 1; } if ((symshndx) && (sym.st_shndx == SHN_XINDEX)) { buf->shndx = symshndx[i]; } else { buf->shndx = sym.st_shndx; if (sym.st_shndx >= SHN_LORESERVE) buf->flags |= FLG_SYM_SPECSEC; } } /* end for loop */ return (s); }