Port crasher to FreeBSD.
diff --git a/tests/crasher.c b/tests/crasher.c
index 65e1b7e..72cd54d 100644
--- a/tests/crasher.c
+++ b/tests/crasher.c
@@ -3,11 +3,17 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
+#include <unistd.h>
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/user.h>
+#endif
 
 void a(void) __attribute__((noinline));
 void b(int x) __attribute__((noinline));
 
-#ifdef __linux__
+#if defined(__linux__)
 void write_maps(char *fname)
 {
     char buf[512], path[128];
@@ -35,6 +41,48 @@
     fclose(out);
     fclose(maps);
 }
+#elif defined(__FreeBSD__)
+void
+write_maps(char *fname)
+{
+    FILE *out;
+    char *buf, *bp, *eb;
+    struct kinfo_vmentry *kv;
+    int mib[4], error;
+    size_t len;
+
+    out = fopen(fname, "w");
+    if (out == NULL)
+        exit(EXIT_FAILURE);
+
+    len = 0;
+    mib[0] = CTL_KERN;
+    mib[1] = KERN_PROC;
+    mib[2] = KERN_PROC_VMMAP;
+    mib[3] = getpid();
+    error = sysctl(mib, 4, NULL, &len, NULL, 0);
+    if (error == -1)
+	exit(EXIT_FAILURE);
+    len = len * 4 / 3;
+    buf = malloc(len);
+    if (buf == NULL)
+	exit(EXIT_FAILURE);
+    error = sysctl(mib, 4, buf, &len, NULL, 0);
+    if (error == -1)
+	    exit(EXIT_FAILURE);
+
+    for (bp = buf, eb = buf + len; bp < eb; bp += kv->kve_structsize) {
+        kv = (struct kinfo_vmentry *)(uintptr_t)bp;
+	if (kv->kve_type == KVME_TYPE_VNODE &&
+	  (kv->kve_protection & KVME_PROT_EXEC) != 0) {
+	    fprintf(out, "0x%jx:%s ", kv->kve_start, kv->kve_path);
+	}
+    }
+
+    fprintf(out, "\n");
+    fclose(out);
+    free(buf);
+}
 #else
 #error Port me
 #endif