diff options
-rw-r--r-- | tools/perf/util/symbol-elf.c | 25 | ||||
-rw-r--r-- | tools/perf/util/symbol-minimal.c | 3 | ||||
-rw-r--r-- | tools/perf/util/symbol.c | 8 | ||||
-rw-r--r-- | tools/perf/util/symbol.h | 4 |
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 | */ |
169 | int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, | 169 | int 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; |
293 | out_elf_end: | 287 | out_elf_end: |
294 | elf_end(elf); | ||
295 | out_close: | ||
296 | close(fd); | ||
297 | |||
298 | if (err == 0) | 288 | if (err == 0) |
299 | return nr; | 289 | return nr; |
300 | out: | ||
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 | ||
269 | int dso__synthesize_plt_symbols(struct dso *dso __used, char *name __used, | 269 | int 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, | |||
370 | int dso__test_data(void); | 370 | int dso__test_data(void); |
371 | int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *ss, | 371 | int 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); |
373 | int dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, | 373 | int 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 | ||
376 | void symbols__insert(struct rb_root *symbols, struct symbol *sym); | 376 | void symbols__insert(struct rb_root *symbols, struct symbol *sym); |
377 | void symbols__fixup_duplicate(struct rb_root *symbols); | 377 | void symbols__fixup_duplicate(struct rb_root *symbols); |