svn commit: r268775 - stable/10/lib/libproc

Dimitry Andric dim at FreeBSD.org
Wed Jul 16 21:04:32 UTC 2014


Author: dim
Date: Wed Jul 16 21:04:31 2014
New Revision: 268775
URL: http://svnweb.freebsd.org/changeset/base/268775

Log:
  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.

Modified:
  stable/10/lib/libproc/Makefile
  stable/10/lib/libproc/proc_sym.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libproc/Makefile
==============================================================================
--- stable/10/lib/libproc/Makefile	Wed Jul 16 20:37:03 2014	(r268774)
+++ stable/10/lib/libproc/Makefile	Wed Jul 16 21:04:31 2014	(r268775)
@@ -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

Modified: stable/10/lib/libproc/proc_sym.c
==============================================================================
--- stable/10/lib/libproc/proc_sym.c	Wed Jul 16 20:37:03 2014	(r268774)
+++ stable/10/lib/libproc/proc_sym.c	Wed Jul 16 21:04:31 2014	(r268775)
@@ -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, 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
@@ -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


More information about the svn-src-stable-10 mailing list