return err;
 }
 
+static bool visible_dir_filter(const char *name, struct dirent *d)
+{
+       if (d->d_type != DT_DIR)
+               return false;
+       return lsdir_no_dot_filter(name, d);
+}
+
 static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
 {
        char kallsyms_filename[PATH_MAX];
-       struct dirent *dent;
        int ret = -1;
-       DIR *d;
+       struct strlist *dirs;
+       struct str_node *nd;
 
-       d = opendir(dir);
-       if (!d)
+       dirs = lsdir(dir, visible_dir_filter);
+       if (!dirs)
                return -1;
 
-       while (1) {
-               dent = readdir(d);
-               if (!dent)
-                       break;
-               if (dent->d_type != DT_DIR)
-                       continue;
+       strlist__for_each(nd, dirs) {
                scnprintf(kallsyms_filename, sizeof(kallsyms_filename),
-                         "%s/%s/kallsyms", dir, dent->d_name);
+                         "%s/%s/kallsyms", dir, nd->s);
                if (!validate_kcore_addresses(kallsyms_filename, map)) {
                        strlcpy(dir, kallsyms_filename, dir_sz);
                        ret = 0;
                }
        }
 
-       closedir(d);
+       strlist__delete(dirs);
 
        return ret;
 }