Implement freebsd-specific vm walker.
diff --git a/src/os-freebsd.c b/src/os-freebsd.c
index 15ce3d4..77fb267 100644
--- a/src/os-freebsd.c
+++ b/src/os-freebsd.c
@@ -24,8 +24,11 @@
 
 #ifndef UNW_REMOTE_ONLY
 
+#include <sys/types.h>
+#include <sys/user.h>
 #include <dlfcn.h>
 #include <unistd.h>
+#include <libutil.h>
 
 #include "libunwind_i.h"
 
@@ -33,9 +36,27 @@
 tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
 		    unsigned long *segbase, unsigned long *mapoff)
 {
+	struct kinfo_vmentry *freep, *kve;
+	int cnt, rc, i;
 
-	/* XXXKIB */
-	return (0);
+	freep = kinfo_getvmmap(pid, &cnt);
+	if (freep == NULL)
+		return (-1);
+	for (i = 0; i < cnt; i++) {
+		kve = &freep[i];
+		if (ip < kve->kve_start || ip >= kve->kve_end)
+			continue;
+		if (kve->kve_type != KVME_TYPE_VNODE) {
+			free(freep);
+			return (-1);
+		}
+		segbase = kve->kve_start;
+		mapoff = kve->kve_offset;
+		rc = elf_map_image(ei, kve->kve_path);
+		free(freep);
+		return (rc);
+	}
+	return (-1);
 }
 
 #endif /* UNW_REMOTE_ONLY */