svn commit: r304450 - stable/11/lib/libsysdecode

Konstantin Belousov kib at FreeBSD.org
Fri Aug 19 07:56:09 UTC 2016


Author: kib
Date: Fri Aug 19 07:56:07 2016
New Revision: 304450
URL: https://svnweb.freebsd.org/changeset/base/304450

Log:
  MFC r303991:
  Decode 32bit utrace records on the 64bit host.

Modified:
  stable/11/lib/libsysdecode/utrace.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/lib/libsysdecode/utrace.c
==============================================================================
--- stable/11/lib/libsysdecode/utrace.c	Fri Aug 19 07:48:32 2016	(r304449)
+++ stable/11/lib/libsysdecode/utrace.c	Fri Aug 19 07:56:07 2016	(r304450)
@@ -33,7 +33,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <dlfcn.h>
 #include <stdio.h>
-#include <strings.h>
+#include <string.h>
 #include <sysdecode.h>
 
 #define	UTRACE_DLOPEN_START		1
@@ -59,6 +59,18 @@ struct utrace_rtld {
 	char name[MAXPATHLEN];
 };
 
+#ifdef __LP64__
+struct utrace_rtld32 {
+	char sig[4];				/* 'RTLD' */
+	int event;
+	uint32_t handle;
+	uint32_t mapbase;
+	uint32_t mapsize;
+	int refcnt;
+	char name[MAXPATHLEN];
+};
+#endif
+
 static int
 print_utrace_rtld(FILE *fp, void *p)
 {
@@ -145,6 +157,14 @@ struct utrace_malloc {
 	void *r;
 };
 
+#ifdef __LP64__
+struct utrace_malloc32 {
+	uint32_t p;
+	uint32_t s;
+	uint32_t r;
+};
+#endif
+
 static void
 print_utrace_malloc(FILE *fp, void *p)
 {
@@ -163,6 +183,12 @@ print_utrace_malloc(FILE *fp, void *p)
 int
 sysdecode_utrace(FILE *fp, void *p, size_t len)
 {
+#ifdef __LP64__
+	struct utrace_rtld ur;
+	struct utrace_rtld32 *pr;
+	struct utrace_malloc um;
+	struct utrace_malloc32 *pm;
+#endif
 
 	if (len == sizeof(struct utrace_rtld) && bcmp(p, "RTLD", 4) == 0) {
 		return (print_utrace_rtld(fp, p));
@@ -172,6 +198,32 @@ sysdecode_utrace(FILE *fp, void *p, size
 		print_utrace_malloc(fp, p);
 		return (1);
 	}
-	
+
+#ifdef __LP64__
+	if (len == sizeof(struct utrace_rtld32) && bcmp(p, "RTLD", 4) == 0) {
+		pr = p;
+		memset(&ur, 0, sizeof(ur));
+		memcpy(ur.sig, pr->sig, sizeof(ur.sig));
+		ur.event = pr->event;
+		ur.handle = (void *)(uintptr_t)pr->handle;
+		ur.mapbase = (void *)(uintptr_t)pr->mapbase;
+		ur.mapsize = pr->mapsize;
+		ur.refcnt = pr->refcnt;
+		memcpy(ur.name, pr->name, sizeof(ur.name));
+		return (print_utrace_rtld(fp, &ur));
+	}
+
+	if (len == sizeof(struct utrace_malloc32)) {
+		pm = p;
+		memset(&um, 0, sizeof(um));
+		um.p = pm->p == (uint32_t)-1 ? (void *)(intptr_t)-1 :
+		    (void *)(uintptr_t)pm->p;
+		um.s = pm->s;
+		um.r = (void *)(uintptr_t)pm->r;
+		print_utrace_malloc(fp, &um);
+		return (1);
+	}
+#endif
+
 	return (0);
 }


More information about the svn-src-all mailing list