diff --git a/libbpf b/libbpf
index 8f8369223c327743277a8e4fcbf87c5d9d6f3c88..c91f1175e2273825767160fdc54448c19c97ba13 160000
--- a/libbpf
+++ b/libbpf
@@ -1 +1 @@
-Subproject commit 8f8369223c327743277a8e4fcbf87c5d9d6f3c88
+Subproject commit c91f1175e2273825767160fdc54448c19c97ba13
diff --git a/src/task_find.bpf.c b/src/task_find.bpf.c
index 5f84a91552dd5ac9f71d34ce50feeb1e5cb6a7ca..85ded8dbdabc8f5332e6e3c6b88ab7cbfce890da 100644
--- a/src/task_find.bpf.c
+++ b/src/task_find.bpf.c
@@ -22,12 +22,39 @@ struct {
 	__type(value, int);
 } dfd_map SEC(".maps");
 
+struct {
+	__uint(type, BPF_MAP_TYPE_ARRAY);
+	__uint(max_entries, MAX_DEPTH);
+	__type(key, int);
+	__type(value, int);
+} namelen_map SEC(".maps");
+
 void *u_descend;
 void *u_ascend;
 void *u_newline;
+void *u_slash;
 void *u_iterdents64_buf;
 size_t root_namelen;
 
+static long print_path(size_t depth) {
+	long err = 0;
+	for (int i = 0; i < MAX_DEPTH; i++) {
+		if (i > depth) {
+			break;
+		}
+		void *name_user = u_iterdents64_buf + i * PATHLEN;
+		int *namelen = bpf_map_lookup_elem(&namelen_map, &i);
+		if (!namelen) {
+			bpf_printk("Error: bpf_map_lookup_elem(&namelen_map, &%d)", i);
+			goto end;
+		}
+		write(STDOUT_FILENO, name_user, *namelen);
+		write(STDOUT_FILENO, u_slash, 1);
+	}
+end:
+	return err;
+}
+
 static long iter_dir(size_t namelen) {
 	long err = 0;
 
@@ -55,6 +82,13 @@ static long iter_dir(size_t namelen) {
 		goto end;
 	}
 
+	/* Populate namelen map for print_path(). */
+	err = bpf_map_update_elem(&namelen_map, &depth, &namelen, BPF_ANY);
+	if (err) {
+		bpf_printk("Error: bpf_map_update_elem(&namelen_map, ...)");
+		goto end;
+	}
+
 	void *name_user = u_iterdents64_buf + depth * PATHLEN;
 
 	int *parent_dfd = bpf_map_lookup_elem(&dfd_map, &depth);
@@ -66,15 +100,12 @@ static long iter_dir(size_t namelen) {
 	int dfd = openat(*parent_dfd, name_user, O_RDONLY | O_DIRECTORY, 0777);
 	if (dfd < 0) {
 		bpf_printk("file, depth = %d", depth);
-		write(STDOUT_FILENO, name_user, namelen);
-		write(STDOUT_FILENO, u_newline, 1);
+		print_path(depth);
 		/* Not a directory, no need to iterate. */
 		goto end;
 	}
 
-	bpf_printk("descend dir %d, depth = %d", dfd, depth);
-	write(STDOUT_FILENO, name_user, namelen);
-	write(STDOUT_FILENO, u_descend, 2);
+	print_path(depth);
 
 	int child_depth = depth + 1;
 	void *child_name_user = u_iterdents64_buf + child_depth * PATHLEN;
diff --git a/src/task_find.c b/src/task_find.c
index cd44ea4fb0e030096806b033847ce3bdd6da629f..24897ea4eca22422ad1091e4898d8528e4ca5920 100644
--- a/src/task_find.c
+++ b/src/task_find.c
@@ -170,6 +170,7 @@ static int bpf_find_by_name(const char *path, const char *name, bool debug) {
 	skel->bss->u_newline = "\n";
 	skel->bss->u_descend = "/\n";
 	skel->bss->u_ascend = "..\n";
+	skel->bss->u_slash = "/";
 
 	char iterdents64_buf[MAX_DEPTH * PATHLEN];
 	skel->bss->u_iterdents64_buf = iterdents64_buf;