diff options
author | Alan Modra <amodra@gmail.com> | 2002-06-26 13:23:45 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2002-06-26 13:23:45 +0000 |
commit | eb3f2f5cfd7ff8acc1f6f03bc289643bd5384791 (patch) | |
tree | 2e442aa40a1ed42734606504c8bd2c50ed92ce9d /binutils | |
parent | fc28fbc2a987c714d48af78ffd43743c462f991e (diff) | |
download | binutils-gdb-eb3f2f5cfd7ff8acc1f6f03bc289643bd5384791.tar.gz |
* nm.c (print_symname): When demangling, strip leading dots from
symbol names to avoid confusing the demangler.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/nm.c | 24 |
2 files changed, 28 insertions, 1 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 72ccd381b42..8d39f9aabbf 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2002-06-26 Alan Modra <amodra@bigpond.net.au> + + * nm.c (print_symname): When demangling, strip leading dots from + symbol names to avoid confusing the demangler. + 2002-06-25 H.J. Lu <hjl@gnu.org> * Makefile.am (check-DEJAGNU): Set LC_ALL=C and export it. diff --git a/binutils/nm.c b/binutils/nm.c index 306f2c60e3e..f97732e0e23 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; |