Print this page
6375 Add native name demangling support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>

*** 23,32 **** --- 23,33 ---- * Copyright (c) 1988 AT&T * Copyright (c) 1989 AT&T * All Rights Reserved * * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2018 Jason King */ #include <stdio.h> #include <stdlib.h> #include <unistd.h>
*** 803,822 **** 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); --- 804,823 ---- 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 = NULL; char *name = (char *)elf_strptr(elf, link, sym.st_name); + dn = conv_demangle_name(name); ! if (dn != name) { ! name = FormatName(name, dn); ! free((void *)dn); ! } else if (exotic(name)) { name = FormatName(name, d_buf); } buf->name = name; } else buf->name = (char *)elf_strptr(elf, link, sym.st_name);
*** 1012,1025 **** #ifndef XPG4 /* * -u flag specified */ static void ! print_with_uflag( ! SYM *sym_data, ! char *filename ! ) { if ((sym_data->shndx == SHN_UNDEF) && (strlen(sym_data->name))) { if (!r_flag) { if (R_flag) { if (archive_name != (char *)0) --- 1013,1023 ---- #ifndef XPG4 /* * -u flag specified */ static void ! print_with_uflag(SYM *sym_data, char *filename) { if ((sym_data->shndx == SHN_UNDEF) && (strlen(sym_data->name))) { if (!r_flag) { if (R_flag) { if (archive_name != (char *)0)
*** 1092,1108 **** /* * -p flag specified */ static void ! print_with_pflag( ! int ndigits, ! Elf *elf_file, ! unsigned int shstrndx, ! SYM *sym_data, ! char *filename ! ) { const char * const fmt[] = { "%.*llu ", /* FMT_T_DEC */ "0x%.*llx ", /* FMT_T_HEX */ "0%.*llo " /* FMT_T_OCT */ --- 1090,1101 ---- /* * -p flag specified */ static void ! print_with_pflag(int ndigits, Elf *elf_file, unsigned int shstrndx, ! SYM *sym_data, char *filename) { const char * const fmt[] = { "%.*llu ", /* FMT_T_DEC */ "0x%.*llx ", /* FMT_T_HEX */ "0%.*llo " /* FMT_T_OCT */
*** 1146,1161 **** /* * -P flag specified */ static void ! print_with_Pflag( ! int ndigits, ! Elf *elf_file, ! unsigned int shstrndx, ! SYM *sym_data ! ) { #define SYM_LEN 10 char sym_name[SYM_LEN+1]; size_t len; const char * const fmt[] = { --- 1139,1150 ---- /* * -P flag specified */ static void ! print_with_Pflag(int ndigits, Elf *elf_file, unsigned int shstrndx, ! SYM *sym_data) { #define SYM_LEN 10 char sym_name[SYM_LEN+1]; size_t len; const char * const fmt[] = {
*** 1198,1214 **** /* * other flags specified */ static void ! print_with_otherflags( ! int ndigits, ! Elf *elf_file, ! unsigned int shstrndx, ! SYM *sym_data, ! char *filename ! ) { const char * const fmt_value_size[] = { "%*llu|%*lld|", /* FMT_T_DEC */ "0x%.*llx|0x%.*llx|", /* FMT_T_HEX */ "0%.*llo|0%.*llo|" /* FMT_T_OCT */ --- 1187,1198 ---- /* * other flags specified */ static void ! print_with_otherflags(int ndigits, Elf *elf_file, unsigned int shstrndx, ! SYM *sym_data, char *filename) { const char * const fmt_value_size[] = { "%*llu|%*lld|", /* FMT_T_DEC */ "0x%.*llx|0x%.*llx|", /* FMT_T_HEX */ "0%.*llo|0%.*llo|" /* FMT_T_OCT */