* budemang.c (demangle): Handle "@plt" suffix.

This commit is contained in:
Alan Modra 2004-10-18 07:08:52 +00:00
parent 40d98813d0
commit 2bb2d727c1
2 changed files with 45 additions and 16 deletions

View File

@ -1,3 +1,7 @@
2004-10-18 Alan Modra <amodra@bigpond.net.au>
* budemang.c (demangle): Handle "@plt" suffix.
2004-10-14 Nick Clifton <nickc@redhat.com>
* nm.c (usage): Fix description of --special-syms switch.

View File

@ -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;
memcpy (add_dots, name, dots);
memcpy (add_dots + dots, res, len);
if (alloc != NULL)
free (alloc);
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);
}