Adding support to decompress file before reading build id. Adding filename__read_build_id and change its current versions to read_build_id.
Signed-off-by: Jiri Olsa <jo...@kernel.org> --- tools/perf/util/symbol-elf.c | 37 ++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index 94a156df22d5..6770572620f3 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -534,7 +534,7 @@ static int elf_read_build_id(Elf *elf, void *bf, size_t size) #ifdef HAVE_LIBBFD_BUILDID_SUPPORT -int filename__read_build_id(const char *filename, void *bf, size_t size) +static int read_build_id(const char *filename, void *bf, size_t size) { int err = -1; bfd *abfd; @@ -562,7 +562,7 @@ int filename__read_build_id(const char *filename, void *bf, size_t size) #else // HAVE_LIBBFD_BUILDID_SUPPORT -int filename__read_build_id(const char *filename, void *bf, size_t size) +static int read_build_id(const char *filename, void *bf, size_t size) { int fd, err = -1; Elf *elf; @@ -591,6 +591,39 @@ int filename__read_build_id(const char *filename, void *bf, size_t size) #endif // HAVE_LIBBFD_BUILDID_SUPPORT +int filename__read_build_id(const char *filename, void *bf, size_t size) +{ + struct kmod_path m = { .name = NULL, }; + char path[PATH_MAX]; + int err; + + if (!filename) + return -EFAULT; + + err = kmod_path__parse(&m, filename); + if (err) + return -1; + + if (m.comp) { + int error = 0, fd; + + fd = filename__decompress(filename, path, sizeof(path), m.comp, &error); + if (fd < 0) { + pr_debug("Failed to decompress (error %d) %s\n", + error, filename); + return -1; + } + close(fd); + filename = path; + } + + err = read_build_id(filename, bf, size); + + if (m.comp) + unlink(filename); + return err; +} + int sysfs__read_build_id(const char *filename, void *build_id, size_t size) { int fd, err = -1; -- 2.26.2