From 2bb2d727c1a0724b85265e77ecd174168ccc1593 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 18 Oct 2004 07:08:52 +0000 Subject: [PATCH] * budemang.c (demangle): Handle "@plt" suffix. --- binutils/ChangeLog | 4 ++++ binutils/budemang.c | 57 ++++++++++++++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index b1c45c58e80..7ba39bee782 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2004-10-18 Alan Modra + + * budemang.c (demangle): Handle "@plt" suffix. + 2004-10-14 Nick Clifton * nm.c (usage): Fix description of --special-syms switch. diff --git a/binutils/budemang.c b/binutils/budemang.c index 525a1c898cf..c992570c3a8 100644 --- a/binutils/budemang.c +++ b/binutils/budemang.c @@ -38,8 +38,9 @@ char * demangle (bfd *abfd, const char *name) { - char *res; - const char *p; + char *res, *alloc; + const char *pre, *suf; + size_t pre_len; if (abfd != NULL && bfd_get_symbol_leading_char (abfd) == name[0]) ++name; @@ -48,28 +49,52 @@ demangle (bfd *abfd, const char *name) 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; + pre = name; + while (*name == '.') + ++name; + pre_len = pre - name; - res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS); - if (res) + alloc = NULL; + suf = strchr (name, '@'); + if (suf != NULL) { - size_t dots = p - name; + alloc = xmalloc (suf - name + 1); + memcpy (alloc, name, suf - name); + alloc[suf - name] = '\0'; + name = alloc; + } - /* Now put back any stripped dots. */ - if (dots != 0) + res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS); + if (res != NULL) + { + /* Now put back any suffix, or stripped dots. */ + if (pre_len != 0 || suf != NULL) { - size_t len = strlen (res) + 1; - char *add_dots = xmalloc (len + dots); + size_t len; + size_t suf_len; + char *final; + + if (alloc != NULL) + free (alloc); - memcpy (add_dots, name, dots); - memcpy (add_dots + dots, res, len); + len = strlen (res); + if (suf == NULL) + suf = res + len; + suf_len = strlen (suf) + 1; + final = xmalloc (pre_len + len + suf_len); + + memcpy (final, pre, pre_len); + memcpy (final + pre_len, res, len); + memcpy (final + pre_len + len, suf, suf_len); free (res); - res = add_dots; + res = final; } + return res; } - return xstrdup (name); + if (alloc != NULL) + free (alloc); + + return xstrdup (pre); } -- 2.30.2