MFC r268463:

In libproc, avoid calling __cxa_demangle(), and thus depending on either
libcxxrt or libsupc++, if WITHOUT_CXX is defined. [1]

Noticed by:	sbruno

[1] However, on stable/10 this is more accurately described by
WITHOUT_GNUCXX, so I've changed the test to that instead.
This commit is contained in:
dim 2014-07-16 21:04:31 +00:00
parent 023ca0c8f6
commit 082dc1af3f
2 changed files with 21 additions and 18 deletions

View File

@ -18,9 +18,11 @@ CFLAGS+= -I${.CURDIR}
.if ${MK_LIBCPLUSPLUS} != "no"
LDADD+= -lcxxrt
DPADD+= ${LIBCXXRT}
.else
.elif ${MK_GNUCXX} != "no"
LDADD+= -lsupc++
DPADD+= ${LIBSTDCPLUSPLUS}
.else
CFLAGS+= -DNO_CXA_DEMANGLE
.endif
SHLIB_MAJOR= 2

View File

@ -46,27 +46,34 @@
#include "_libproc.h"
#ifndef NO_CXA_DEMANGLE
extern char *__cxa_demangle(const char *, char *, size_t *, int *);
#endif /* NO_CXA_DEMANGLE */
static void proc_rdl2prmap(rd_loadobj_t *, prmap_t *);
static void
demangle(const char *symbol, char *buf, size_t len)
{
#ifndef NO_CXA_DEMANGLE
char *dembuf;
size_t demlen = len;
size_t demlen;
dembuf = malloc(len);
if (!dembuf)
goto fail;
dembuf = __cxa_demangle(symbol, dembuf, &demlen, NULL);
if (!dembuf)
goto fail;
strlcpy(buf, dembuf, len);
free(dembuf);
if (symbol[0] == '_' && symbol[1] == 'Z' && symbol[2]) {
dembuf = malloc(len);
if (!dembuf)
goto fail;
demlen = len;
dembuf = __cxa_demangle(symbol, dembuf, &demlen, NULL);
if (!dembuf)
goto fail;
strlcpy(buf, dembuf, len);
free(dembuf);
}
return;
fail:
#endif /* NO_CXA_DEMANGLE */
strlcpy(buf, symbol, len);
}
@ -291,10 +298,7 @@ proc_addr2sym(struct proc_handle *p, uintptr_t addr, char *name,
if (addr >= rsym && addr < rsym + sym.st_size) {
s = elf_strptr(e, dynsymstridx, sym.st_name);
if (s) {
if (s[0] == '_' && s[1] == 'Z' && s[2])
demangle(s, name, namesz);
else
strlcpy(name, s, namesz);
demangle(s, name, namesz);
memcpy(symcopy, &sym, sizeof(sym));
/*
* DTrace expects the st_value to contain
@ -329,10 +333,7 @@ symtab:
if (addr >= rsym && addr < rsym + sym.st_size) {
s = elf_strptr(e, symtabstridx, sym.st_name);
if (s) {
if (s[0] == '_' && s[1] == 'Z' && s[2])
demangle(s, name, namesz);
else
strlcpy(name, s, namesz);
demangle(s, name, namesz);
memcpy(symcopy, &sym, sizeof(sym));
/*
* DTrace expects the st_value to contain