Print this page
libconv


 460 
 461                         if (strlen(sym_name))
 462                                 (void) printf("%-20s", sym_name);
 463                         else {
 464                                 (void) printf("%-20d", sym.st_name);
 465                         }
 466                         (void) printf("%-20s",
 467                             conv_reloc_type(p_ehdr->e_machine,
 468                             type, DUMP_CONVFMT, &inv_buf));
 469                 }
 470                 (void) printf("\n");
 471                 ndx++;
 472         }
 473 }
 474 
 475 /* demangle C++ names */
 476 static char *
 477 demangled_name(char *s)
 478 {
 479         static char     *buf = NULL;

 480         const char      *dn;
 481         size_t          len;
 482 
 483         dn = conv_demangle_name(s);
 484 
 485         /*
 486          * If not demangled, just return the symbol name
 487          */
 488         if (strcmp(s, dn) == 0)
 489                 return (s);
 490 
 491         /*
 492          * Demangled. Format it
 493          */
 494         if (buf != NULL)
 495                 free(buf);
 496 
 497         len = strlen(dn) + strlen(s) + 4;



 498         if ((buf = malloc(len)) == NULL)
 499                 return (s);


 500 
 501         (void) snprintf(buf, len, "%s\t[%s]", dn, s);




 502         return (buf);
 503 }
 504 
 505 /*
 506  * Print the symbol table.  Input is an ELF file descriptor, a
 507  * pointer to the symbol table SCNTAB structure,
 508  * the number of symbols, a range of symbols to print,
 509  * an index which is the number of the
 510  * section in the file, and the filename.  The number of sections,
 511  * the range, and the index are set in
 512  * dump_symbol_table, depending on whether -n or -T were set.
 513  */
 514 static void
 515 print_symtab(Elf *elf_file, SCNTAB *p_symtab, Elf_Data *sym_data,
 516     long range, int index)
 517 {
 518         GElf_Sym sym;
 519         int adj = 0;            /* field adjustment for elf64 */
 520         Elf32_Word      *symshndx = 0;
 521         unsigned int    nosymshndx = 0;
 522         Conv_inv_buf_t  inv_buf;
 523 
 524 
 525         if (gelf_getclass(elf_file) == ELFCLASS64)
 526                 adj = 8;
 527 
 528         while (range > 0) {
 529                 char            *sym_name = (char *)0;
 530                 int             type, bind;
 531                 int             specsec;
 532                 unsigned int    shndx;
 533 
 534                 (void) gelf_getsym(sym_data, index, &sym);
 535                 type = (int)GELF_ST_TYPE(sym.st_info);
 536                 bind = (int)GELF_ST_BIND(sym.st_info);
 537 
 538                 if ((sym.st_shndx == SHN_XINDEX) &&
 539                     (symshndx == 0) && (nosymshndx == 0)) {
 540                         Elf_Scn         *_scn;
 541                         GElf_Shdr       _shdr;
 542                         size_t          symscnndx;
 543 
 544                         symscnndx = elf_ndxscn(p_symtab->p_sd);
 545                         _scn = 0;
 546                         while ((_scn = elf_nextscn(elf_file, _scn)) != 0) {
 547                                 if (gelf_getshdr(_scn, &_shdr) == 0)
 548                                         break;
 549                                 if ((_shdr.sh_type == SHT_SYMTAB_SHNDX) &&




 460 
 461                         if (strlen(sym_name))
 462                                 (void) printf("%-20s", sym_name);
 463                         else {
 464                                 (void) printf("%-20d", sym.st_name);
 465                         }
 466                         (void) printf("%-20s",
 467                             conv_reloc_type(p_ehdr->e_machine,
 468                             type, DUMP_CONVFMT, &inv_buf));
 469                 }
 470                 (void) printf("\n");
 471                 ndx++;
 472         }
 473 }
 474 
 475 /* demangle C++ names */
 476 static char *
 477 demangled_name(char *s)
 478 {
 479         static char     *buf = NULL;
 480         size_t          buflen = 0;
 481         const char      *dn;
 482         size_t          len;
 483 
 484         dn = conv_demangle_name(s);
 485 
 486         /*
 487          * If not demangled, just return the symbol name
 488          */
 489         if (dn == s)
 490                 return (s);
 491 






 492         len = strlen(dn) + strlen(s) + 4;
 493 
 494         if (buflen < len) {
 495                 free(buf);
 496                 if ((buf = malloc(len)) == NULL)
 497                         return (s);
 498                 buflen = len;
 499         }
 500 
 501         /*
 502          * Demangled. Format it
 503          */
 504         (void) snprintf(buf, buflen, "%s\t[%s]", dn, s);
 505         free(dn);
 506         return (buf);
 507 }
 508 
 509 /*
 510  * Print the symbol table.  Input is an ELF file descriptor, a
 511  * pointer to the symbol table SCNTAB structure,
 512  * the number of symbols, a range of symbols to print,
 513  * an index which is the number of the
 514  * section in the file, and the filename.  The number of sections,
 515  * the range, and the index are set in
 516  * dump_symbol_table, depending on whether -n or -T were set.
 517  */
 518 static void
 519 print_symtab(Elf *elf_file, SCNTAB *p_symtab, Elf_Data *sym_data,
 520     long range, int index)
 521 {
 522         GElf_Sym sym;
 523         int adj = 0;            /* field adjustment for elf64 */
 524         Elf32_Word      *symshndx = 0;
 525         unsigned int    nosymshndx = 0;
 526         Conv_inv_buf_t  inv_buf;
 527 
 528 
 529         if (gelf_getclass(elf_file) == ELFCLASS64)
 530                 adj = 8;
 531 
 532         while (range > 0) {
 533                 char            *sym_name = NULL;
 534                 int             type, bind;
 535                 int             specsec;
 536                 unsigned int    shndx;
 537 
 538                 (void) gelf_getsym(sym_data, index, &sym);
 539                 type = (int)GELF_ST_TYPE(sym.st_info);
 540                 bind = (int)GELF_ST_BIND(sym.st_info);
 541 
 542                 if ((sym.st_shndx == SHN_XINDEX) &&
 543                     (symshndx == 0) && (nosymshndx == 0)) {
 544                         Elf_Scn         *_scn;
 545                         GElf_Shdr       _shdr;
 546                         size_t          symscnndx;
 547 
 548                         symscnndx = elf_ndxscn(p_symtab->p_sd);
 549                         _scn = 0;
 550                         while ((_scn = elf_nextscn(elf_file, _scn)) != 0) {
 551                                 if (gelf_getshdr(_scn, &_shdr) == 0)
 552                                         break;
 553                                 if ((_shdr.sh_type == SHT_SYMTAB_SHNDX) &&