|
@@ -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;
|