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 */