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