aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/symbol-elf.c25
-rw-r--r--tools/perf/util/symbol-minimal.c3
-rw-r--r--tools/perf/util/symbol.c8
-rw-r--r--tools/perf/util/symbol.h4
4 files changed, 16 insertions, 24 deletions
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 3a9c38a39bc9..591594775904 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,
166 * And always look at the original dso, not at debuginfo packages, that 166 * And always look at the original dso, not at debuginfo packages, that
167 * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS). 167 * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
168 */ 168 */
169int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, 169int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *map,
170 symbol_filter_t filter) 170 symbol_filter_t filter)
171{ 171{
172 uint32_t nr_rel_entries, idx; 172 uint32_t nr_rel_entries, idx;
@@ -181,21 +181,15 @@ int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map,
181 GElf_Ehdr ehdr; 181 GElf_Ehdr ehdr;
182 char sympltname[1024]; 182 char sympltname[1024];
183 Elf *elf; 183 Elf *elf;
184 int nr = 0, symidx, fd, err = 0; 184 int nr = 0, symidx, err = 0;
185 185
186 fd = open(name, O_RDONLY); 186 elf = ss->elf;
187 if (fd < 0) 187 ehdr = ss->ehdr;
188 goto out;
189
190 elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
191 if (elf == NULL)
192 goto out_close;
193 188
194 if (gelf_getehdr(elf, &ehdr) == NULL) 189 scn_dynsym = ss->dynsym;
195 goto out_elf_end; 190 shdr_dynsym = ss->dynshdr;
191 dynsym_idx = ss->dynsym_idx;
196 192
197 scn_dynsym = elf_section_by_name(elf, &ehdr, &shdr_dynsym,
198 ".dynsym", &dynsym_idx);
199 if (scn_dynsym == NULL) 193 if (scn_dynsym == NULL)
200 goto out_elf_end; 194 goto out_elf_end;
201 195
@@ -291,13 +285,8 @@ int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map,
291 285
292 err = 0; 286 err = 0;
293out_elf_end: 287out_elf_end:
294 elf_end(elf);
295out_close:
296 close(fd);
297
298 if (err == 0) 288 if (err == 0)
299 return nr; 289 return nr;
300out:
301 pr_debug("%s: problems reading %s PLT info.\n", 290 pr_debug("%s: problems reading %s PLT info.\n",
302 __func__, dso->long_name); 291 __func__, dso->long_name);
303 return 0; 292 return 0;
diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-minimal.c
index 1b16c2729a36..cc580c046c04 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)
266 close(ss->fd); 266 close(ss->fd);
267} 267}
268 268
269int dso__synthesize_plt_symbols(struct dso *dso __used, char *name __used, 269int dso__synthesize_plt_symbols(struct dso *dso __used,
270 struct symsrc *ss __used,
270 struct map *map __used, 271 struct map *map __used,
271 symbol_filter_t filter __used) 272 symbol_filter_t filter __used)
272{ 273{
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 2b3495a93fb6..f8a306865201 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1091,21 +1091,23 @@ restart:
1091 1091
1092 ret = dso__load_sym(dso, map, &ss, filter, 0, 1092 ret = dso__load_sym(dso, map, &ss, filter, 0,
1093 want_symtab); 1093 want_symtab);
1094 symsrc__destroy(&ss);
1095 1094
1096 /* 1095 /*
1097 * Some people seem to have debuginfo files _WITHOUT_ debug 1096 * Some people seem to have debuginfo files _WITHOUT_ debug
1098 * info!?!? 1097 * info!?!?
1099 */ 1098 */
1100 if (!ret) 1099 if (!ret) {
1100 symsrc__destroy(&ss);
1101 continue; 1101 continue;
1102 }
1102 1103
1103 if (ret > 0) { 1104 if (ret > 0) {
1104 int nr_plt; 1105 int nr_plt;
1105 1106
1106 nr_plt = dso__synthesize_plt_symbols(dso, name, map, filter); 1107 nr_plt = dso__synthesize_plt_symbols(dso, &ss, map, filter);
1107 if (nr_plt > 0) 1108 if (nr_plt > 0)
1108 ret += nr_plt; 1109 ret += nr_plt;
1110 symsrc__destroy(&ss);
1109 break; 1111 break;
1110 } 1112 }
1111 } 1113 }
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index dd9e8678b355..2981513ce1d4 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,
370int dso__test_data(void); 370int dso__test_data(void);
371int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *ss, 371int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *ss,
372 symbol_filter_t filter, int kmodule, int want_symtab); 372 symbol_filter_t filter, int kmodule, int want_symtab);
373int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, 373int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss,
374 symbol_filter_t filter); 374 struct map *map, symbol_filter_t filter);
375 375
376void symbols__insert(struct rb_root *symbols, struct symbol *sym); 376void symbols__insert(struct rb_root *symbols, struct symbol *sym);
377void symbols__fixup_duplicate(struct rb_root *symbols); 377void symbols__fixup_duplicate(struct rb_root *symbols);