diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index 3a9c38a39bc9a3e158a9593b560bf1be746638f4..591594775904c42a63c6e58a05b213c833674e8a 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -166,7 +166,7 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, * And always look at the original dso, not at debuginfo packages, that * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS). */ -int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, +int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *map, symbol_filter_t filter) { uint32_t nr_rel_entries, idx; @@ -181,21 +181,15 @@ int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, GElf_Ehdr ehdr; char sympltname[1024]; Elf *elf; - int nr = 0, symidx, fd, err = 0; + int nr = 0, symidx, err = 0; - fd = open(name, O_RDONLY); - if (fd < 0) - goto out; - - elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL); - if (elf == NULL) - goto out_close; + elf = ss->elf; + ehdr = ss->ehdr; - if (gelf_getehdr(elf, &ehdr) == NULL) - goto out_elf_end; + scn_dynsym = ss->dynsym; + shdr_dynsym = ss->dynshdr; + dynsym_idx = ss->dynsym_idx; - scn_dynsym = elf_section_by_name(elf, &ehdr, &shdr_dynsym, - ".dynsym", &dynsym_idx); if (scn_dynsym == NULL) goto out_elf_end; @@ -291,13 +285,8 @@ int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, err = 0; out_elf_end: - elf_end(elf); -out_close: - close(fd); - if (err == 0) return nr; -out: pr_debug("%s: problems reading %s PLT info.\n", __func__, dso->long_name); return 0; diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-minimal.c index 1b16c2729a3629f8972ba61d5a8522641173188e..cc580c046c047a2bee2445eea47f9231ed2eacaf 100644 --- a/tools/perf/util/symbol-minimal.c +++ b/tools/perf/util/symbol-minimal.c @@ -266,7 +266,8 @@ void symsrc__destroy(struct symsrc *ss) close(ss->fd); } -int dso__synthesize_plt_symbols(struct dso *dso __used, char *name __used, +int dso__synthesize_plt_symbols(struct dso *dso __used, + struct symsrc *ss __used, struct map *map __used, symbol_filter_t filter __used) { diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 2b3495a93fb643cd874cf12b1d6c00885e8c2efb..f8a30686520118d0dfcf4910dfac47b7a5aa83c8 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1091,21 +1091,23 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter) ret = dso__load_sym(dso, map, &ss, filter, 0, want_symtab); - symsrc__destroy(&ss); /* * Some people seem to have debuginfo files _WITHOUT_ debug * info!?!? */ - if (!ret) + if (!ret) { + symsrc__destroy(&ss); continue; + } if (ret > 0) { int nr_plt; - nr_plt = dso__synthesize_plt_symbols(dso, name, map, filter); + nr_plt = dso__synthesize_plt_symbols(dso, &ss, map, filter); if (nr_plt > 0) ret += nr_plt; + symsrc__destroy(&ss); break; } } diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index dd9e8678b355673db06025a671b91cf92e6d3ff5..2981513ce1d43f68ab10a94682c783fca3ee1cbc 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h @@ -370,8 +370,8 @@ ssize_t dso__data_read_addr(struct dso *dso, struct map *map, int dso__test_data(void); int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *ss, symbol_filter_t filter, int kmodule, int want_symtab); -int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, - symbol_filter_t filter); +int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, + struct map *map, symbol_filter_t filter); void symbols__insert(struct rb_root *symbols, struct symbol *sym); void symbols__fixup_duplicate(struct rb_root *symbols);