aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorCody P Schafer <cody@linux.vnet.ibm.com>2012-08-10 18:22:59 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-08-13 13:34:36 -0400
commita44f605b2f6eadb771a052aa3a5eefb342b38a39 (patch)
tree924153f1da161016a68358e61268a1862fc5bb43 /tools/perf
parent005f92947a0da7eb47b0f1ff611f8fc3d7ab4751 (diff)
perf symbols: Switch dso__synthesize_plt_symbols() to use symsrc
Previously dso__synthesize_plt_symbols() was reopening the elf file to obtain dynsyms from it. Rather than reopen the file, use the already opened reference within the symsrc to access it. Setup for the later patch "perf symbols: Use both runtime and debug images" Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com> Cc: David Hansen <dave@linux.vnet.ibm.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Matt Hellsley <matthltc@us.ibm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/1344637382-22789-14-git-send-email-cody@linux.vnet.ibm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-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);