diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c
index c93eca9a7be39f67c5c3638d5d6ddc13770457dd..04743d3e903922ff5d3c3308380ace0196d6a4f4 100644
--- a/tools/perf/util/string.c
+++ b/tools/perf/util/string.c
@@ -1,3 +1,4 @@
+#include <string.h>
 #include "string.h"
 
 static int hex(char ch)
@@ -32,3 +33,13 @@ int hex2u64(const char *ptr, u64 *long_val)
 
 	return p - ptr;
 }
+
+char *strxfrchar(char *s, char from, char to)
+{
+	char *p = s;
+
+	while ((p = strchr(p, from)) != NULL)
+		*p++ = to;
+
+	return s;
+}
diff --git a/tools/perf/util/string.h b/tools/perf/util/string.h
index 15c827475e7d20cfc069244ab991cac3b7b32232..2c84bf65ba0fac020c2df05732b4b7ee0d6afabc 100644
--- a/tools/perf/util/string.h
+++ b/tools/perf/util/string.h
@@ -4,6 +4,7 @@
 #include "types.h"
 
 int hex2u64(const char *ptr, u64 *val);
+char *strxfrchar(char *s, char from, char to);
 
 #define _STR(x) #x
 #define STR(x) _STR(x)
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 4dfdefd5ec7eee4cb369ebe068318f781e20d8d5..e3eebdd682d926b8c07ec2e75b43db35e6380346 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -189,7 +189,7 @@ struct symbol *dso__find_symbol(struct dso *self, u64 ip)
 
 size_t dso__fprintf(struct dso *self, FILE *fp)
 {
-	size_t ret = fprintf(fp, "dso: %s\n", self->long_name);
+	size_t ret = fprintf(fp, "dso: %s\n", self->short_name);
 
 	struct rb_node *nd;
 	for (nd = rb_first(&self->syms); nd; nd = rb_next(nd)) {
@@ -977,6 +977,7 @@ static int dsos__load_modules_sym_dir(char *dirname,
 			snprintf(dso_name, sizeof(dso_name), "[%.*s]",
 				 (int)(dot - dent->d_name), dent->d_name);
 
+			strxfrchar(dso_name, '-', '_');
 			map = kernel_maps__find_by_dso_name(dso_name);
 			if (map == NULL)
 				continue;