aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/symbol.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index cb086cbe6b10..9cf6dbcd158c 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1334,13 +1334,37 @@ out_failure:
1334static int dso__load_vmlinux(struct dso *self, struct map *map, 1334static int dso__load_vmlinux(struct dso *self, struct map *map,
1335 const char *vmlinux, symbol_filter_t filter) 1335 const char *vmlinux, symbol_filter_t filter)
1336{ 1336{
1337 int err, fd = open(vmlinux, O_RDONLY); 1337 int err = -1, fd;
1338 1338
1339 self->loaded = 1; 1339 if (self->has_build_id) {
1340 u8 build_id[BUILD_ID_SIZE];
1341
1342 if (filename__read_build_id(vmlinux, build_id,
1343 sizeof(build_id)) < 0) {
1344 pr_debug("No build_id in %s, ignoring it\n", vmlinux);
1345 return -1;
1346 }
1347 if (!dso__build_id_equal(self, build_id)) {
1348 char expected_build_id[BUILD_ID_SIZE * 2 + 1],
1349 vmlinux_build_id[BUILD_ID_SIZE * 2 + 1];
1350
1351 build_id__sprintf(self->build_id,
1352 sizeof(self->build_id),
1353 expected_build_id);
1354 build_id__sprintf(build_id, sizeof(build_id),
1355 vmlinux_build_id);
1356 pr_debug("build_id in %s is %s while expected is %s, "
1357 "ignoring it\n", vmlinux, vmlinux_build_id,
1358 expected_build_id);
1359 return -1;
1360 }
1361 }
1340 1362
1363 fd = open(vmlinux, O_RDONLY);
1341 if (fd < 0) 1364 if (fd < 0)
1342 return -1; 1365 return -1;
1343 1366
1367 self->loaded = 1;
1344 err = dso__load_sym(self, map, self->long_name, fd, filter, 1, 0); 1368 err = dso__load_sym(self, map, self->long_name, fd, filter, 1, 0);
1345 1369
1346 close(fd); 1370 close(fd);