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:
parent
023ca0c8f6
commit
082dc1af3f
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user