From eb3f2f5cfd7ff8acc1f6f03bc289643bd5384791 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 26 Jun 2002 13:23:45 +0000 Subject: * nm.c (print_symname): When demangling, strip leading dots from symbol names to avoid confusing the demangler. --- binutils/ChangeLog | 5 +++++ binutils/nm.c | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 72ccd38..8d39f9a 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2002-06-26 Alan Modra + + * nm.c (print_symname): When demangling, strip leading dots from + symbol names to avoid confusing the demangler. + 2002-06-25 H.J. Lu * Makefile.am (check-DEJAGNU): Set LC_ALL=C and export it. diff --git a/binutils/nm.c b/binutils/nm.c index 306f2c6..f97732e 100644 --- a/binutils/nm.c +++ b/binutils/nm.c @@ -1086,6 +1086,7 @@ print_symname (format, name, abfd) if (do_demangle && *name) { char *res; + const char *p; /* In this mode, give a user-level view of the symbol name even if it's not mangled; strip off any leading @@ -1093,9 +1094,30 @@ print_symname (format, name, abfd) if (bfd_get_symbol_leading_char (abfd) == name[0]) name++; - res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS); + /* This is a hack for XCOFF, PowerPC64-ELF or the MS PE format. + These formats have a number of leading '.'s on at least some + symbols, so we remove all dots to avoid confusing the + demangler. */ + p = name; + while (*p == '.') + ++p; + + res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS); if (res) { + size_t dots = p - name; + + /* Now put back any stripped dots. */ + if (dots != 0) + { + size_t len = strlen (res) + 1; + char *add_dots = xmalloc (len + dots); + + memcpy (add_dots, name, dots); + memcpy (add_dots + dots, res, len); + free (res); + res = add_dots; + } printf (format, res); free (res); return; -- cgit v1.1