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

@@ -23,10 +23,11 @@
  * 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,20 +804,20 @@
                 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;
+                        const char *dn = NULL;
                         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)) {
+                        if (dn != name) {
+                                name = FormatName(name, dn);
+                                free((void *)dn);
+                        } else 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);
 

@@ -1012,14 +1013,11 @@
 #ifndef XPG4
 /*
  * -u flag specified
  */
 static void
-print_with_uflag(
-        SYM *sym_data,
-        char *filename
-)
+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,17 +1090,12 @@
 
 /*
  * -p flag specified
  */
 static void
-print_with_pflag(
-        int ndigits,
-        Elf *elf_file,
-        unsigned int shstrndx,
-        SYM *sym_data,
-        char *filename
-)
+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,16 +1139,12 @@
 
 /*
  * -P flag specified
  */
 static void
-print_with_Pflag(
-        int ndigits,
-        Elf *elf_file,
-        unsigned int shstrndx,
-        SYM *sym_data
-)
+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,17 +1187,12 @@
 
 /*
  * other flags specified
  */
 static void
-print_with_otherflags(
-        int ndigits,
-        Elf *elf_file,
-        unsigned int shstrndx,
-        SYM *sym_data,
-        char *filename
-)
+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 */