Minchan reported that perf failed to load vmlinux if --symfs argument doesn't end with '/' character. So make sure that the symfs always ends with the '/'.
Reported-by: Minchan Kim <minc...@kernel.org> Signed-off-by: Namhyung Kim <namhy...@kernel.org> --- tools/perf/util/symbol.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index eb06746b06b2..90723a12e947 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1829,7 +1829,7 @@ static bool symbol__read_kptr_restrict(void) int symbol__init(void) { - const char *symfs; + char *symfs; if (symbol_conf.initialized) return 0; @@ -1862,23 +1862,40 @@ int symbol__init(void) symbol_conf.sym_list_str, "symbol") < 0) goto out_free_comm_list; - /* - * A path to symbols of "/" is identical to "" - * reset here for simplicity. - */ - symfs = realpath(symbol_conf.symfs, NULL); - if (symfs == NULL) - symfs = symbol_conf.symfs; - if (strcmp(symfs, "/") == 0) - symbol_conf.symfs = ""; - if (symfs != symbol_conf.symfs) - free((void *)symfs); + if (*symbol_conf.symfs) { + symfs = realpath(symbol_conf.symfs, NULL); + if (symfs == NULL) + symfs = (char *)symbol_conf.symfs; + + /* + * A path to symbols of "/" is identical to "" + * reset here for simplicity. + */ + if (strcmp(symfs, "/") == 0) + symbol_conf.symfs = ""; + + /* ensure symfs ends with '/' */ + if (symfs[strlen(symfs)-1] != '/') { + char *tmp = realloc(symfs, strlen(symfs) + 2); + if (tmp == NULL) + goto out_free; + + tmp[strlen(tmp)+1] = '\0'; + tmp[strlen(tmp)] = '/'; + + symbol_conf.symfs = tmp; + } else { + free(symfs); + } + } symbol_conf.kptr_restrict = symbol__read_kptr_restrict(); symbol_conf.initialized = true; return 0; +out_free: + free(symfs); out_free_comm_list: strlist__delete(symbol_conf.comm_list); out_free_dso_list: -- 2.0.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/