aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/util/symbol.c11
-rw-r--r--tools/perf/util/symbol.h2
2 files changed, 7 insertions, 6 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 98a13114de70..4683b67b5ee4 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -555,9 +555,10 @@ static int dso__load_sym(struct dso *self, int fd, const char *name,
555 nr_syms = shdr.sh_size / shdr.sh_entsize; 555 nr_syms = shdr.sh_size / shdr.sh_entsize;
556 556
557 memset(&sym, 0, sizeof(sym)); 557 memset(&sym, 0, sizeof(sym));
558 self->prelinked = elf_section_by_name(elf, &ehdr, &shdr, 558 self->adjust_symbols = (ehdr.e_type == ET_EXEC ||
559 ".gnu.prelink_undo", 559 elf_section_by_name(elf, &ehdr, &shdr,
560 NULL) != NULL; 560 ".gnu.prelink_undo",
561 NULL) != NULL);
561 elf_symtab__for_each_symbol(syms, nr_syms, index, sym) { 562 elf_symtab__for_each_symbol(syms, nr_syms, index, sym) {
562 struct symbol *f; 563 struct symbol *f;
563 u64 obj_start; 564 u64 obj_start;
@@ -580,7 +581,7 @@ static int dso__load_sym(struct dso *self, int fd, const char *name,
580 section_name = elf_sec__name(&shdr, secstrs); 581 section_name = elf_sec__name(&shdr, secstrs);
581 obj_start = sym.st_value; 582 obj_start = sym.st_value;
582 583
583 if (self->prelinked) { 584 if (self->adjust_symbols) {
584 if (verbose >= 2) 585 if (verbose >= 2)
585 printf("adjusting symbol: st_value: %Lx sh_addr: %Lx sh_offset: %Lx\n", 586 printf("adjusting symbol: st_value: %Lx sh_addr: %Lx sh_offset: %Lx\n",
586 (u64)sym.st_value, (u64)shdr.sh_addr, (u64)shdr.sh_offset); 587 (u64)sym.st_value, (u64)shdr.sh_addr, (u64)shdr.sh_offset);
@@ -632,7 +633,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose)
632 if (!name) 633 if (!name)
633 return -1; 634 return -1;
634 635
635 self->prelinked = 0; 636 self->adjust_symbols = 0;
636 637
637 if (strncmp(self->name, "/tmp/perf-", 10) == 0) 638 if (strncmp(self->name, "/tmp/perf-", 10) == 0)
638 return dso__load_perf_map(self, filter, verbose); 639 return dso__load_perf_map(self, filter, verbose);
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index 4e141a30911e..7918cffb23cd 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -24,7 +24,7 @@ struct dso {
24 struct rb_root syms; 24 struct rb_root syms;
25 struct symbol *(*find_symbol)(struct dso *, u64 ip); 25 struct symbol *(*find_symbol)(struct dso *, u64 ip);
26 unsigned int sym_priv_size; 26 unsigned int sym_priv_size;
27 unsigned char prelinked; 27 unsigned char adjust_symbols;
28 char name[0]; 28 char name[0];
29}; 29};
30 30