aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/symbol-elf.c
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/util/symbol-elf.c
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/util/symbol-elf.c')
-rw-r--r--tools/perf/util/symbol-elf.c25
1 files changed, 7 insertions, 18 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;