svn commit: r268463 - head/lib/libproc

Dimitry Andric dim at FreeBSD.org
Wed Jul 9 17:31:58 UTC 2014


Author: dim
Date: Wed Jul  9 17:31:57 2014
New Revision: 268463
URL: http://svnweb.freebsd.org/changeset/base/268463

Log:
  In libproc, avoid calling __cxa_demangle(), and thus depending on either
  libcxxrt or libsupc++, if WITHOUT_CXX is defined.
  
  Noticed by:	sbruno
  MFC after:	1 week

Modified:
  head/lib/libproc/Makefile
  head/lib/libproc/proc_sym.c

Modified: head/lib/libproc/Makefile
==============================================================================
--- head/lib/libproc/Makefile	Wed Jul  9 16:07:36 2014	(r268462)
+++ head/lib/libproc/Makefile	Wed Jul  9 17:31:57 2014	(r268463)
@@ -15,7 +15,9 @@ INCS=	libproc.h
 
 CFLAGS+=	-I${.CURDIR}
 
-.if ${MK_LIBCPLUSPLUS} != "no"
+.if ${MK_CXX} == "no"
+CFLAGS+=	-DNO_CXA_DEMANGLE
+.elif ${MK_LIBCPLUSPLUS} != "no"
 LDADD+=		-lcxxrt
 DPADD+=		${LIBCXXRT}
 .else

Modified: head/lib/libproc/proc_sym.c
==============================================================================
--- head/lib/libproc/proc_sym.c	Wed Jul  9 16:07:36 2014	(r268462)
+++ head/lib/libproc/proc_sym.c	Wed Jul  9 17:31:57 2014	(r268463)
@@ -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);
 }
 
@@ -297,10 +304,7 @@ proc_addr2sym(struct proc_handle *p, uin
 		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
@@ -335,10 +339,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


More information about the svn-src-head mailing list