aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog4
-rw-r--r--ld/ldmisc.c22
2 files changed, 24 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 5fd9bb7..593fd27 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,7 @@
+2002-06-26 Alan Modra <amodra@bigpond.net.au>
+
+ * ldmisc.c (demangle): Restore dots stripped from sym name.
+
2002-06-25 H.J. Lu <hjl@gnu.org>
* Makefile.am (check-DEJAGNU): Set LC_ALL=C and export it.
diff --git a/ld/ldmisc.c b/ld/ldmisc.c
index 42adcee..b24678e 100644
--- a/ld/ldmisc.c
+++ b/ld/ldmisc.c
@@ -78,13 +78,31 @@ demangle (string)
/* This is a hack for better error reporting on 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. */
+ on at least some symbols, so we remove all dots to avoid
+ confusing the demangler. */
p = string;
while (*p == '.')
++p;
res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS);
- return res ? res : xstrdup (string);
+ if (res)
+ {
+ size_t dots = p - string;
+
+ /* Now put back any stripped dots. */
+ if (dots != 0)
+ {
+ size_t len = strlen (res) + 1;
+ char *add_dots = xmalloc (len + dots);
+
+ memcpy (add_dots, string, dots);
+ memcpy (add_dots + dots, res, len);
+ free (res);
+ res = add_dots;
+ }
+ return res;
+ }
+ return xstrdup (string);
}
static void