perf symbols: Ignore mapping symbols on aarch64
[firefly-linux-kernel-4.4.55.git] / tools / perf / util / symbol-elf.c
1 #include <fcntl.h>
2 #include <stdio.h>
3 #include <errno.h>
4 #include <string.h>
5 #include <unistd.h>
6 #include <inttypes.h>
7
8 #include "symbol.h"
9 #include "machine.h"
10 #include "vdso.h"
11 #include <symbol/kallsyms.h>
12 #include "debug.h"
13
14 #ifdef HAVE_CPLUS_DEMANGLE_SUPPORT
15 extern char *cplus_demangle(const char *, int);
16
17 static inline char *bfd_demangle(void __maybe_unused *v, const char *c, int i)
18 {
19         return cplus_demangle(c, i);
20 }
21 #else
22 #ifdef NO_DEMANGLE
23 static inline char *bfd_demangle(void __maybe_unused *v,
24                                  const char __maybe_unused *c,
25                                  int __maybe_unused i)
26 {
27         return NULL;
28 }
29 #else
30 #define PACKAGE 'perf'
31 #include <bfd.h>
32 #endif
33 #endif
34
35 #ifndef HAVE_ELF_GETPHDRNUM_SUPPORT
36 static int elf_getphdrnum(Elf *elf, size_t *dst)
37 {
38         GElf_Ehdr gehdr;
39         GElf_Ehdr *ehdr;
40
41         ehdr = gelf_getehdr(elf, &gehdr);
42         if (!ehdr)
43                 return -1;
44
45         *dst = ehdr->e_phnum;
46
47         return 0;
48 }
49 #endif
50
51 #ifndef NT_GNU_BUILD_ID
52 #define NT_GNU_BUILD_ID 3
53 #endif
54
55 /**
56  * elf_symtab__for_each_symbol - iterate thru all the symbols
57  *
58  * @syms: struct elf_symtab instance to iterate
59  * @idx: uint32_t idx
60  * @sym: GElf_Sym iterator
61  */
62 #define elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) \
63         for (idx = 0, gelf_getsym(syms, idx, &sym);\
64              idx < nr_syms; \
65              idx++, gelf_getsym(syms, idx, &sym))
66
67 static inline uint8_t elf_sym__type(const GElf_Sym *sym)
68 {
69         return GELF_ST_TYPE(sym->st_info);
70 }
71
72 static inline int elf_sym__is_function(const GElf_Sym *sym)
73 {
74         return (elf_sym__type(sym) == STT_FUNC ||
75                 elf_sym__type(sym) == STT_GNU_IFUNC) &&
76                sym->st_name != 0 &&
77                sym->st_shndx != SHN_UNDEF;
78 }
79
80 static inline bool elf_sym__is_object(const GElf_Sym *sym)
81 {
82         return elf_sym__type(sym) == STT_OBJECT &&
83                 sym->st_name != 0 &&
84                 sym->st_shndx != SHN_UNDEF;
85 }
86
87 static inline int elf_sym__is_label(const GElf_Sym *sym)
88 {
89         return elf_sym__type(sym) == STT_NOTYPE &&
90                 sym->st_name != 0 &&
91                 sym->st_shndx != SHN_UNDEF &&
92                 sym->st_shndx != SHN_ABS;
93 }
94
95 static bool elf_sym__is_a(GElf_Sym *sym, enum map_type type)
96 {
97         switch (type) {
98         case MAP__FUNCTION:
99                 return elf_sym__is_function(sym);
100         case MAP__VARIABLE:
101                 return elf_sym__is_object(sym);
102         default:
103                 return false;
104         }
105 }
106
107 static inline const char *elf_sym__name(const GElf_Sym *sym,
108                                         const Elf_Data *symstrs)
109 {
110         return symstrs->d_buf + sym->st_name;
111 }
112
113 static inline const char *elf_sec__name(const GElf_Shdr *shdr,
114                                         const Elf_Data *secstrs)
115 {
116         return secstrs->d_buf + shdr->sh_name;
117 }
118
119 static inline int elf_sec__is_text(const GElf_Shdr *shdr,
120                                         const Elf_Data *secstrs)
121 {
122         return strstr(elf_sec__name(shdr, secstrs), "text") != NULL;
123 }
124
125 static inline bool elf_sec__is_data(const GElf_Shdr *shdr,
126                                     const Elf_Data *secstrs)
127 {
128         return strstr(elf_sec__name(shdr, secstrs), "data") != NULL;
129 }
130
131 static bool elf_sec__is_a(GElf_Shdr *shdr, Elf_Data *secstrs,
132                           enum map_type type)
133 {
134         switch (type) {
135         case MAP__FUNCTION:
136                 return elf_sec__is_text(shdr, secstrs);
137         case MAP__VARIABLE:
138                 return elf_sec__is_data(shdr, secstrs);
139         default:
140                 return false;
141         }
142 }
143
144 static size_t elf_addr_to_index(Elf *elf, GElf_Addr addr)
145 {
146         Elf_Scn *sec = NULL;
147         GElf_Shdr shdr;
148         size_t cnt = 1;
149
150         while ((sec = elf_nextscn(elf, sec)) != NULL) {
151                 gelf_getshdr(sec, &shdr);
152
153                 if ((addr >= shdr.sh_addr) &&
154                     (addr < (shdr.sh_addr + shdr.sh_size)))
155                         return cnt;
156
157                 ++cnt;
158         }
159
160         return -1;
161 }
162
163 Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
164                              GElf_Shdr *shp, const char *name, size_t *idx)
165 {
166         Elf_Scn *sec = NULL;
167         size_t cnt = 1;
168
169         /* Elf is corrupted/truncated, avoid calling elf_strptr. */
170         if (!elf_rawdata(elf_getscn(elf, ep->e_shstrndx), NULL))
171                 return NULL;
172
173         while ((sec = elf_nextscn(elf, sec)) != NULL) {
174                 char *str;
175
176                 gelf_getshdr(sec, shp);
177                 str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name);
178                 if (str && !strcmp(name, str)) {
179                         if (idx)
180                                 *idx = cnt;
181                         return sec;
182                 }
183                 ++cnt;
184         }
185
186         return NULL;
187 }
188
189 #define elf_section__for_each_rel(reldata, pos, pos_mem, idx, nr_entries) \
190         for (idx = 0, pos = gelf_getrel(reldata, 0, &pos_mem); \
191              idx < nr_entries; \
192              ++idx, pos = gelf_getrel(reldata, idx, &pos_mem))
193
194 #define elf_section__for_each_rela(reldata, pos, pos_mem, idx, nr_entries) \
195         for (idx = 0, pos = gelf_getrela(reldata, 0, &pos_mem); \
196              idx < nr_entries; \
197              ++idx, pos = gelf_getrela(reldata, idx, &pos_mem))
198
199 /*
200  * We need to check if we have a .dynsym, so that we can handle the
201  * .plt, synthesizing its symbols, that aren't on the symtabs (be it
202  * .dynsym or .symtab).
203  * And always look at the original dso, not at debuginfo packages, that
204  * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
205  */
206 int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *map,
207                                 symbol_filter_t filter)
208 {
209         uint32_t nr_rel_entries, idx;
210         GElf_Sym sym;
211         u64 plt_offset;
212         GElf_Shdr shdr_plt;
213         struct symbol *f;
214         GElf_Shdr shdr_rel_plt, shdr_dynsym;
215         Elf_Data *reldata, *syms, *symstrs;
216         Elf_Scn *scn_plt_rel, *scn_symstrs, *scn_dynsym;
217         size_t dynsym_idx;
218         GElf_Ehdr ehdr;
219         char sympltname[1024];
220         Elf *elf;
221         int nr = 0, symidx, err = 0;
222
223         if (!ss->dynsym)
224                 return 0;
225
226         elf = ss->elf;
227         ehdr = ss->ehdr;
228
229         scn_dynsym = ss->dynsym;
230         shdr_dynsym = ss->dynshdr;
231         dynsym_idx = ss->dynsym_idx;
232
233         if (scn_dynsym == NULL)
234                 goto out_elf_end;
235
236         scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
237                                           ".rela.plt", NULL);
238         if (scn_plt_rel == NULL) {
239                 scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
240                                                   ".rel.plt", NULL);
241                 if (scn_plt_rel == NULL)
242                         goto out_elf_end;
243         }
244
245         err = -1;
246
247         if (shdr_rel_plt.sh_link != dynsym_idx)
248                 goto out_elf_end;
249
250         if (elf_section_by_name(elf, &ehdr, &shdr_plt, ".plt", NULL) == NULL)
251                 goto out_elf_end;
252
253         /*
254          * Fetch the relocation section to find the idxes to the GOT
255          * and the symbols in the .dynsym they refer to.
256          */
257         reldata = elf_getdata(scn_plt_rel, NULL);
258         if (reldata == NULL)
259                 goto out_elf_end;
260
261         syms = elf_getdata(scn_dynsym, NULL);
262         if (syms == NULL)
263                 goto out_elf_end;
264
265         scn_symstrs = elf_getscn(elf, shdr_dynsym.sh_link);
266         if (scn_symstrs == NULL)
267                 goto out_elf_end;
268
269         symstrs = elf_getdata(scn_symstrs, NULL);
270         if (symstrs == NULL)
271                 goto out_elf_end;
272
273         if (symstrs->d_size == 0)
274                 goto out_elf_end;
275
276         nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize;
277         plt_offset = shdr_plt.sh_offset;
278
279         if (shdr_rel_plt.sh_type == SHT_RELA) {
280                 GElf_Rela pos_mem, *pos;
281
282                 elf_section__for_each_rela(reldata, pos, pos_mem, idx,
283                                            nr_rel_entries) {
284                         symidx = GELF_R_SYM(pos->r_info);
285                         plt_offset += shdr_plt.sh_entsize;
286                         gelf_getsym(syms, symidx, &sym);
287                         snprintf(sympltname, sizeof(sympltname),
288                                  "%s@plt", elf_sym__name(&sym, symstrs));
289
290                         f = symbol__new(plt_offset, shdr_plt.sh_entsize,
291                                         STB_GLOBAL, sympltname);
292                         if (!f)
293                                 goto out_elf_end;
294
295                         if (filter && filter(map, f))
296                                 symbol__delete(f);
297                         else {
298                                 symbols__insert(&dso->symbols[map->type], f);
299                                 ++nr;
300                         }
301                 }
302         } else if (shdr_rel_plt.sh_type == SHT_REL) {
303                 GElf_Rel pos_mem, *pos;
304                 elf_section__for_each_rel(reldata, pos, pos_mem, idx,
305                                           nr_rel_entries) {
306                         symidx = GELF_R_SYM(pos->r_info);
307                         plt_offset += shdr_plt.sh_entsize;
308                         gelf_getsym(syms, symidx, &sym);
309                         snprintf(sympltname, sizeof(sympltname),
310                                  "%s@plt", elf_sym__name(&sym, symstrs));
311
312                         f = symbol__new(plt_offset, shdr_plt.sh_entsize,
313                                         STB_GLOBAL, sympltname);
314                         if (!f)
315                                 goto out_elf_end;
316
317                         if (filter && filter(map, f))
318                                 symbol__delete(f);
319                         else {
320                                 symbols__insert(&dso->symbols[map->type], f);
321                                 ++nr;
322                         }
323                 }
324         }
325
326         err = 0;
327 out_elf_end:
328         if (err == 0)
329                 return nr;
330         pr_debug("%s: problems reading %s PLT info.\n",
331                  __func__, dso->long_name);
332         return 0;
333 }
334
335 /*
336  * Align offset to 4 bytes as needed for note name and descriptor data.
337  */
338 #define NOTE_ALIGN(n) (((n) + 3) & -4U)
339
340 static int elf_read_build_id(Elf *elf, void *bf, size_t size)
341 {
342         int err = -1;
343         GElf_Ehdr ehdr;
344         GElf_Shdr shdr;
345         Elf_Data *data;
346         Elf_Scn *sec;
347         Elf_Kind ek;
348         void *ptr;
349
350         if (size < BUILD_ID_SIZE)
351                 goto out;
352
353         ek = elf_kind(elf);
354         if (ek != ELF_K_ELF)
355                 goto out;
356
357         if (gelf_getehdr(elf, &ehdr) == NULL) {
358                 pr_err("%s: cannot get elf header.\n", __func__);
359                 goto out;
360         }
361
362         /*
363          * Check following sections for notes:
364          *   '.note.gnu.build-id'
365          *   '.notes'
366          *   '.note' (VDSO specific)
367          */
368         do {
369                 sec = elf_section_by_name(elf, &ehdr, &shdr,
370                                           ".note.gnu.build-id", NULL);
371                 if (sec)
372                         break;
373
374                 sec = elf_section_by_name(elf, &ehdr, &shdr,
375                                           ".notes", NULL);
376                 if (sec)
377                         break;
378
379                 sec = elf_section_by_name(elf, &ehdr, &shdr,
380                                           ".note", NULL);
381                 if (sec)
382                         break;
383
384                 return err;
385
386         } while (0);
387
388         data = elf_getdata(sec, NULL);
389         if (data == NULL)
390                 goto out;
391
392         ptr = data->d_buf;
393         while (ptr < (data->d_buf + data->d_size)) {
394                 GElf_Nhdr *nhdr = ptr;
395                 size_t namesz = NOTE_ALIGN(nhdr->n_namesz),
396                        descsz = NOTE_ALIGN(nhdr->n_descsz);
397                 const char *name;
398
399                 ptr += sizeof(*nhdr);
400                 name = ptr;
401                 ptr += namesz;
402                 if (nhdr->n_type == NT_GNU_BUILD_ID &&
403                     nhdr->n_namesz == sizeof("GNU")) {
404                         if (memcmp(name, "GNU", sizeof("GNU")) == 0) {
405                                 size_t sz = min(size, descsz);
406                                 memcpy(bf, ptr, sz);
407                                 memset(bf + sz, 0, size - sz);
408                                 err = descsz;
409                                 break;
410                         }
411                 }
412                 ptr += descsz;
413         }
414
415 out:
416         return err;
417 }
418
419 int filename__read_build_id(const char *filename, void *bf, size_t size)
420 {
421         int fd, err = -1;
422         Elf *elf;
423
424         if (size < BUILD_ID_SIZE)
425                 goto out;
426
427         fd = open(filename, O_RDONLY);
428         if (fd < 0)
429                 goto out;
430
431         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
432         if (elf == NULL) {
433                 pr_debug2("%s: cannot read %s ELF file.\n", __func__, filename);
434                 goto out_close;
435         }
436
437         err = elf_read_build_id(elf, bf, size);
438
439         elf_end(elf);
440 out_close:
441         close(fd);
442 out:
443         return err;
444 }
445
446 int sysfs__read_build_id(const char *filename, void *build_id, size_t size)
447 {
448         int fd, err = -1;
449
450         if (size < BUILD_ID_SIZE)
451                 goto out;
452
453         fd = open(filename, O_RDONLY);
454         if (fd < 0)
455                 goto out;
456
457         while (1) {
458                 char bf[BUFSIZ];
459                 GElf_Nhdr nhdr;
460                 size_t namesz, descsz;
461
462                 if (read(fd, &nhdr, sizeof(nhdr)) != sizeof(nhdr))
463                         break;
464
465                 namesz = NOTE_ALIGN(nhdr.n_namesz);
466                 descsz = NOTE_ALIGN(nhdr.n_descsz);
467                 if (nhdr.n_type == NT_GNU_BUILD_ID &&
468                     nhdr.n_namesz == sizeof("GNU")) {
469                         if (read(fd, bf, namesz) != (ssize_t)namesz)
470                                 break;
471                         if (memcmp(bf, "GNU", sizeof("GNU")) == 0) {
472                                 size_t sz = min(descsz, size);
473                                 if (read(fd, build_id, sz) == (ssize_t)sz) {
474                                         memset(build_id + sz, 0, size - sz);
475                                         err = 0;
476                                         break;
477                                 }
478                         } else if (read(fd, bf, descsz) != (ssize_t)descsz)
479                                 break;
480                 } else {
481                         int n = namesz + descsz;
482                         if (read(fd, bf, n) != n)
483                                 break;
484                 }
485         }
486         close(fd);
487 out:
488         return err;
489 }
490
491 int filename__read_debuglink(const char *filename, char *debuglink,
492                              size_t size)
493 {
494         int fd, err = -1;
495         Elf *elf;
496         GElf_Ehdr ehdr;
497         GElf_Shdr shdr;
498         Elf_Data *data;
499         Elf_Scn *sec;
500         Elf_Kind ek;
501
502         fd = open(filename, O_RDONLY);
503         if (fd < 0)
504                 goto out;
505
506         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
507         if (elf == NULL) {
508                 pr_debug2("%s: cannot read %s ELF file.\n", __func__, filename);
509                 goto out_close;
510         }
511
512         ek = elf_kind(elf);
513         if (ek != ELF_K_ELF)
514                 goto out_elf_end;
515
516         if (gelf_getehdr(elf, &ehdr) == NULL) {
517                 pr_err("%s: cannot get elf header.\n", __func__);
518                 goto out_elf_end;
519         }
520
521         sec = elf_section_by_name(elf, &ehdr, &shdr,
522                                   ".gnu_debuglink", NULL);
523         if (sec == NULL)
524                 goto out_elf_end;
525
526         data = elf_getdata(sec, NULL);
527         if (data == NULL)
528                 goto out_elf_end;
529
530         /* the start of this section is a zero-terminated string */
531         strncpy(debuglink, data->d_buf, size);
532
533         err = 0;
534
535 out_elf_end:
536         elf_end(elf);
537 out_close:
538         close(fd);
539 out:
540         return err;
541 }
542
543 static int dso__swap_init(struct dso *dso, unsigned char eidata)
544 {
545         static unsigned int const endian = 1;
546
547         dso->needs_swap = DSO_SWAP__NO;
548
549         switch (eidata) {
550         case ELFDATA2LSB:
551                 /* We are big endian, DSO is little endian. */
552                 if (*(unsigned char const *)&endian != 1)
553                         dso->needs_swap = DSO_SWAP__YES;
554                 break;
555
556         case ELFDATA2MSB:
557                 /* We are little endian, DSO is big endian. */
558                 if (*(unsigned char const *)&endian != 0)
559                         dso->needs_swap = DSO_SWAP__YES;
560                 break;
561
562         default:
563                 pr_err("unrecognized DSO data encoding %d\n", eidata);
564                 return -EINVAL;
565         }
566
567         return 0;
568 }
569
570 static int decompress_kmodule(struct dso *dso, const char *name,
571                               enum dso_binary_type type)
572 {
573         int fd;
574         const char *ext = strrchr(name, '.');
575         char tmpbuf[] = "/tmp/perf-kmod-XXXXXX";
576
577         if (type != DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP &&
578             type != DSO_BINARY_TYPE__GUEST_KMODULE_COMP &&
579             type != DSO_BINARY_TYPE__BUILD_ID_CACHE)
580                 return -1;
581
582         if (!ext || !is_supported_compression(ext + 1)) {
583                 ext = strrchr(dso->name, '.');
584                 if (!ext || !is_supported_compression(ext + 1))
585                         return -1;
586         }
587
588         fd = mkstemp(tmpbuf);
589         if (fd < 0)
590                 return -1;
591
592         if (!decompress_to_file(ext + 1, name, fd)) {
593                 close(fd);
594                 fd = -1;
595         }
596
597         unlink(tmpbuf);
598
599         return fd;
600 }
601
602 bool symsrc__possibly_runtime(struct symsrc *ss)
603 {
604         return ss->dynsym || ss->opdsec;
605 }
606
607 bool symsrc__has_symtab(struct symsrc *ss)
608 {
609         return ss->symtab != NULL;
610 }
611
612 void symsrc__destroy(struct symsrc *ss)
613 {
614         zfree(&ss->name);
615         elf_end(ss->elf);
616         close(ss->fd);
617 }
618
619 int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
620                  enum dso_binary_type type)
621 {
622         int err = -1;
623         GElf_Ehdr ehdr;
624         Elf *elf;
625         int fd;
626
627         if (dso__needs_decompress(dso))
628                 fd = decompress_kmodule(dso, name, type);
629         else
630                 fd = open(name, O_RDONLY);
631
632         if (fd < 0)
633                 return -1;
634
635         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
636         if (elf == NULL) {
637                 pr_debug("%s: cannot read %s ELF file.\n", __func__, name);
638                 goto out_close;
639         }
640
641         if (gelf_getehdr(elf, &ehdr) == NULL) {
642                 pr_debug("%s: cannot get elf header.\n", __func__);
643                 goto out_elf_end;
644         }
645
646         if (dso__swap_init(dso, ehdr.e_ident[EI_DATA]))
647                 goto out_elf_end;
648
649         /* Always reject images with a mismatched build-id: */
650         if (dso->has_build_id) {
651                 u8 build_id[BUILD_ID_SIZE];
652
653                 if (elf_read_build_id(elf, build_id, BUILD_ID_SIZE) < 0)
654                         goto out_elf_end;
655
656                 if (!dso__build_id_equal(dso, build_id))
657                         goto out_elf_end;
658         }
659
660         ss->is_64_bit = (gelf_getclass(elf) == ELFCLASS64);
661
662         ss->symtab = elf_section_by_name(elf, &ehdr, &ss->symshdr, ".symtab",
663                         NULL);
664         if (ss->symshdr.sh_type != SHT_SYMTAB)
665                 ss->symtab = NULL;
666
667         ss->dynsym_idx = 0;
668         ss->dynsym = elf_section_by_name(elf, &ehdr, &ss->dynshdr, ".dynsym",
669                         &ss->dynsym_idx);
670         if (ss->dynshdr.sh_type != SHT_DYNSYM)
671                 ss->dynsym = NULL;
672
673         ss->opdidx = 0;
674         ss->opdsec = elf_section_by_name(elf, &ehdr, &ss->opdshdr, ".opd",
675                         &ss->opdidx);
676         if (ss->opdshdr.sh_type != SHT_PROGBITS)
677                 ss->opdsec = NULL;
678
679         if (dso->kernel == DSO_TYPE_USER) {
680                 GElf_Shdr shdr;
681                 ss->adjust_symbols = (ehdr.e_type == ET_EXEC ||
682                                 ehdr.e_type == ET_REL ||
683                                 dso__is_vdso(dso) ||
684                                 elf_section_by_name(elf, &ehdr, &shdr,
685                                                      ".gnu.prelink_undo",
686                                                      NULL) != NULL);
687         } else {
688                 ss->adjust_symbols = ehdr.e_type == ET_EXEC ||
689                                      ehdr.e_type == ET_REL;
690         }
691
692         ss->name   = strdup(name);
693         if (!ss->name)
694                 goto out_elf_end;
695
696         ss->elf    = elf;
697         ss->fd     = fd;
698         ss->ehdr   = ehdr;
699         ss->type   = type;
700
701         return 0;
702
703 out_elf_end:
704         elf_end(elf);
705 out_close:
706         close(fd);
707         return err;
708 }
709
710 /**
711  * ref_reloc_sym_not_found - has kernel relocation symbol been found.
712  * @kmap: kernel maps and relocation reference symbol
713  *
714  * This function returns %true if we are dealing with the kernel maps and the
715  * relocation reference symbol has not yet been found.  Otherwise %false is
716  * returned.
717  */
718 static bool ref_reloc_sym_not_found(struct kmap *kmap)
719 {
720         return kmap && kmap->ref_reloc_sym && kmap->ref_reloc_sym->name &&
721                !kmap->ref_reloc_sym->unrelocated_addr;
722 }
723
724 /**
725  * ref_reloc - kernel relocation offset.
726  * @kmap: kernel maps and relocation reference symbol
727  *
728  * This function returns the offset of kernel addresses as determined by using
729  * the relocation reference symbol i.e. if the kernel has not been relocated
730  * then the return value is zero.
731  */
732 static u64 ref_reloc(struct kmap *kmap)
733 {
734         if (kmap && kmap->ref_reloc_sym &&
735             kmap->ref_reloc_sym->unrelocated_addr)
736                 return kmap->ref_reloc_sym->addr -
737                        kmap->ref_reloc_sym->unrelocated_addr;
738         return 0;
739 }
740
741 static bool want_demangle(bool is_kernel_sym)
742 {
743         return is_kernel_sym ? symbol_conf.demangle_kernel : symbol_conf.demangle;
744 }
745
746 int dso__load_sym(struct dso *dso, struct map *map,
747                   struct symsrc *syms_ss, struct symsrc *runtime_ss,
748                   symbol_filter_t filter, int kmodule)
749 {
750         struct kmap *kmap = dso->kernel ? map__kmap(map) : NULL;
751         struct map *curr_map = map;
752         struct dso *curr_dso = dso;
753         Elf_Data *symstrs, *secstrs;
754         uint32_t nr_syms;
755         int err = -1;
756         uint32_t idx;
757         GElf_Ehdr ehdr;
758         GElf_Shdr shdr;
759         Elf_Data *syms, *opddata = NULL;
760         GElf_Sym sym;
761         Elf_Scn *sec, *sec_strndx;
762         Elf *elf;
763         int nr = 0;
764         bool remap_kernel = false, adjust_kernel_syms = false;
765
766         dso->symtab_type = syms_ss->type;
767         dso->is_64_bit = syms_ss->is_64_bit;
768         dso->rel = syms_ss->ehdr.e_type == ET_REL;
769
770         /*
771          * Modules may already have symbols from kallsyms, but those symbols
772          * have the wrong values for the dso maps, so remove them.
773          */
774         if (kmodule && syms_ss->symtab)
775                 symbols__delete(&dso->symbols[map->type]);
776
777         if (!syms_ss->symtab) {
778                 /*
779                  * If the vmlinux is stripped, fail so we will fall back
780                  * to using kallsyms. The vmlinux runtime symbols aren't
781                  * of much use.
782                  */
783                 if (dso->kernel)
784                         goto out_elf_end;
785
786                 syms_ss->symtab  = syms_ss->dynsym;
787                 syms_ss->symshdr = syms_ss->dynshdr;
788         }
789
790         elf = syms_ss->elf;
791         ehdr = syms_ss->ehdr;
792         sec = syms_ss->symtab;
793         shdr = syms_ss->symshdr;
794
795         if (runtime_ss->opdsec)
796                 opddata = elf_rawdata(runtime_ss->opdsec, NULL);
797
798         syms = elf_getdata(sec, NULL);
799         if (syms == NULL)
800                 goto out_elf_end;
801
802         sec = elf_getscn(elf, shdr.sh_link);
803         if (sec == NULL)
804                 goto out_elf_end;
805
806         symstrs = elf_getdata(sec, NULL);
807         if (symstrs == NULL)
808                 goto out_elf_end;
809
810         sec_strndx = elf_getscn(runtime_ss->elf, runtime_ss->ehdr.e_shstrndx);
811         if (sec_strndx == NULL)
812                 goto out_elf_end;
813
814         secstrs = elf_getdata(sec_strndx, NULL);
815         if (secstrs == NULL)
816                 goto out_elf_end;
817
818         nr_syms = shdr.sh_size / shdr.sh_entsize;
819
820         memset(&sym, 0, sizeof(sym));
821
822         /*
823          * The kernel relocation symbol is needed in advance in order to adjust
824          * kernel maps correctly.
825          */
826         if (ref_reloc_sym_not_found(kmap)) {
827                 elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
828                         const char *elf_name = elf_sym__name(&sym, symstrs);
829
830                         if (strcmp(elf_name, kmap->ref_reloc_sym->name))
831                                 continue;
832                         kmap->ref_reloc_sym->unrelocated_addr = sym.st_value;
833                         map->reloc = kmap->ref_reloc_sym->addr -
834                                      kmap->ref_reloc_sym->unrelocated_addr;
835                         break;
836                 }
837         }
838
839         dso->adjust_symbols = runtime_ss->adjust_symbols || ref_reloc(kmap);
840         /*
841          * Initial kernel and module mappings do not map to the dso.  For
842          * function mappings, flag the fixups.
843          */
844         if (map->type == MAP__FUNCTION && (dso->kernel || kmodule)) {
845                 remap_kernel = true;
846                 adjust_kernel_syms = dso->adjust_symbols;
847         }
848         elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
849                 struct symbol *f;
850                 const char *elf_name = elf_sym__name(&sym, symstrs);
851                 char *demangled = NULL;
852                 int is_label = elf_sym__is_label(&sym);
853                 const char *section_name;
854                 bool used_opd = false;
855
856                 if (!is_label && !elf_sym__is_a(&sym, map->type))
857                         continue;
858
859                 /* Reject ARM ELF "mapping symbols": these aren't unique and
860                  * don't identify functions, so will confuse the profile
861                  * output: */
862                 if (ehdr.e_machine == EM_ARM || ehdr.e_machine == EM_AARCH64) {
863                         if (elf_name[0] == '$' && strchr("adtx", elf_name[1])
864                             && (elf_name[2] == '\0' || elf_name[2] == '.'))
865                                 continue;
866                 }
867
868                 if (runtime_ss->opdsec && sym.st_shndx == runtime_ss->opdidx) {
869                         u32 offset = sym.st_value - syms_ss->opdshdr.sh_addr;
870                         u64 *opd = opddata->d_buf + offset;
871                         sym.st_value = DSO__SWAP(dso, u64, *opd);
872                         sym.st_shndx = elf_addr_to_index(runtime_ss->elf,
873                                         sym.st_value);
874                         used_opd = true;
875                 }
876                 /*
877                  * When loading symbols in a data mapping, ABS symbols (which
878                  * has a value of SHN_ABS in its st_shndx) failed at
879                  * elf_getscn().  And it marks the loading as a failure so
880                  * already loaded symbols cannot be fixed up.
881                  *
882                  * I'm not sure what should be done. Just ignore them for now.
883                  * - Namhyung Kim
884                  */
885                 if (sym.st_shndx == SHN_ABS)
886                         continue;
887
888                 sec = elf_getscn(runtime_ss->elf, sym.st_shndx);
889                 if (!sec)
890                         goto out_elf_end;
891
892                 gelf_getshdr(sec, &shdr);
893
894                 if (is_label && !elf_sec__is_a(&shdr, secstrs, map->type))
895                         continue;
896
897                 section_name = elf_sec__name(&shdr, secstrs);
898
899                 /* On ARM, symbols for thumb functions have 1 added to
900                  * the symbol address as a flag - remove it */
901                 if ((ehdr.e_machine == EM_ARM) &&
902                     (map->type == MAP__FUNCTION) &&
903                     (sym.st_value & 1))
904                         --sym.st_value;
905
906                 if (dso->kernel || kmodule) {
907                         char dso_name[PATH_MAX];
908
909                         /* Adjust symbol to map to file offset */
910                         if (adjust_kernel_syms)
911                                 sym.st_value -= shdr.sh_addr - shdr.sh_offset;
912
913                         if (strcmp(section_name,
914                                    (curr_dso->short_name +
915                                     dso->short_name_len)) == 0)
916                                 goto new_symbol;
917
918                         if (strcmp(section_name, ".text") == 0) {
919                                 /*
920                                  * The initial kernel mapping is based on
921                                  * kallsyms and identity maps.  Overwrite it to
922                                  * map to the kernel dso.
923                                  */
924                                 if (remap_kernel && dso->kernel) {
925                                         remap_kernel = false;
926                                         map->start = shdr.sh_addr +
927                                                      ref_reloc(kmap);
928                                         map->end = map->start + shdr.sh_size;
929                                         map->pgoff = shdr.sh_offset;
930                                         map->map_ip = map__map_ip;
931                                         map->unmap_ip = map__unmap_ip;
932                                         /* Ensure maps are correctly ordered */
933                                         map_groups__remove(kmap->kmaps, map);
934                                         map_groups__insert(kmap->kmaps, map);
935                                 }
936
937                                 /*
938                                  * The initial module mapping is based on
939                                  * /proc/modules mapped to offset zero.
940                                  * Overwrite it to map to the module dso.
941                                  */
942                                 if (remap_kernel && kmodule) {
943                                         remap_kernel = false;
944                                         map->pgoff = shdr.sh_offset;
945                                 }
946
947                                 curr_map = map;
948                                 curr_dso = dso;
949                                 goto new_symbol;
950                         }
951
952                         if (!kmap)
953                                 goto new_symbol;
954
955                         snprintf(dso_name, sizeof(dso_name),
956                                  "%s%s", dso->short_name, section_name);
957
958                         curr_map = map_groups__find_by_name(kmap->kmaps, map->type, dso_name);
959                         if (curr_map == NULL) {
960                                 u64 start = sym.st_value;
961
962                                 if (kmodule)
963                                         start += map->start + shdr.sh_offset;
964
965                                 curr_dso = dso__new(dso_name);
966                                 if (curr_dso == NULL)
967                                         goto out_elf_end;
968                                 curr_dso->kernel = dso->kernel;
969                                 curr_dso->long_name = dso->long_name;
970                                 curr_dso->long_name_len = dso->long_name_len;
971                                 curr_map = map__new2(start, curr_dso,
972                                                      map->type);
973                                 if (curr_map == NULL) {
974                                         dso__delete(curr_dso);
975                                         goto out_elf_end;
976                                 }
977                                 if (adjust_kernel_syms) {
978                                         curr_map->start = shdr.sh_addr +
979                                                           ref_reloc(kmap);
980                                         curr_map->end = curr_map->start +
981                                                         shdr.sh_size;
982                                         curr_map->pgoff = shdr.sh_offset;
983                                 } else {
984                                         curr_map->map_ip = identity__map_ip;
985                                         curr_map->unmap_ip = identity__map_ip;
986                                 }
987                                 curr_dso->symtab_type = dso->symtab_type;
988                                 map_groups__insert(kmap->kmaps, curr_map);
989                                 /*
990                                  * The new DSO should go to the kernel DSOS
991                                  */
992                                 dsos__add(&map->groups->machine->kernel_dsos,
993                                           curr_dso);
994                                 dso__set_loaded(curr_dso, map->type);
995                         } else
996                                 curr_dso = curr_map->dso;
997
998                         goto new_symbol;
999                 }
1000
1001                 if ((used_opd && runtime_ss->adjust_symbols)
1002                                 || (!used_opd && syms_ss->adjust_symbols)) {
1003                         pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " "
1004                                   "sh_addr: %#" PRIx64 " sh_offset: %#" PRIx64 "\n", __func__,
1005                                   (u64)sym.st_value, (u64)shdr.sh_addr,
1006                                   (u64)shdr.sh_offset);
1007                         sym.st_value -= shdr.sh_addr - shdr.sh_offset;
1008                 }
1009 new_symbol:
1010                 /*
1011                  * We need to figure out if the object was created from C++ sources
1012                  * DWARF DW_compile_unit has this, but we don't always have access
1013                  * to it...
1014                  */
1015                 if (want_demangle(dso->kernel || kmodule)) {
1016                         int demangle_flags = DMGL_NO_OPTS;
1017                         if (verbose)
1018                                 demangle_flags = DMGL_PARAMS | DMGL_ANSI;
1019
1020                         demangled = bfd_demangle(NULL, elf_name, demangle_flags);
1021                         if (demangled != NULL)
1022                                 elf_name = demangled;
1023                 }
1024                 f = symbol__new(sym.st_value, sym.st_size,
1025                                 GELF_ST_BIND(sym.st_info), elf_name);
1026                 free(demangled);
1027                 if (!f)
1028                         goto out_elf_end;
1029
1030                 if (filter && filter(curr_map, f))
1031                         symbol__delete(f);
1032                 else {
1033                         symbols__insert(&curr_dso->symbols[curr_map->type], f);
1034                         nr++;
1035                 }
1036         }
1037
1038         /*
1039          * For misannotated, zeroed, ASM function sizes.
1040          */
1041         if (nr > 0) {
1042                 symbols__fixup_duplicate(&dso->symbols[map->type]);
1043                 symbols__fixup_end(&dso->symbols[map->type]);
1044                 if (kmap) {
1045                         /*
1046                          * We need to fixup this here too because we create new
1047                          * maps here, for things like vsyscall sections.
1048                          */
1049                         __map_groups__fixup_end(kmap->kmaps, map->type);
1050                 }
1051         }
1052         err = nr;
1053 out_elf_end:
1054         return err;
1055 }
1056
1057 static int elf_read_maps(Elf *elf, bool exe, mapfn_t mapfn, void *data)
1058 {
1059         GElf_Phdr phdr;
1060         size_t i, phdrnum;
1061         int err;
1062         u64 sz;
1063
1064         if (elf_getphdrnum(elf, &phdrnum))
1065                 return -1;
1066
1067         for (i = 0; i < phdrnum; i++) {
1068                 if (gelf_getphdr(elf, i, &phdr) == NULL)
1069                         return -1;
1070                 if (phdr.p_type != PT_LOAD)
1071                         continue;
1072                 if (exe) {
1073                         if (!(phdr.p_flags & PF_X))
1074                                 continue;
1075                 } else {
1076                         if (!(phdr.p_flags & PF_R))
1077                                 continue;
1078                 }
1079                 sz = min(phdr.p_memsz, phdr.p_filesz);
1080                 if (!sz)
1081                         continue;
1082                 err = mapfn(phdr.p_vaddr, sz, phdr.p_offset, data);
1083                 if (err)
1084                         return err;
1085         }
1086         return 0;
1087 }
1088
1089 int file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data,
1090                     bool *is_64_bit)
1091 {
1092         int err;
1093         Elf *elf;
1094
1095         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
1096         if (elf == NULL)
1097                 return -1;
1098
1099         if (is_64_bit)
1100                 *is_64_bit = (gelf_getclass(elf) == ELFCLASS64);
1101
1102         err = elf_read_maps(elf, exe, mapfn, data);
1103
1104         elf_end(elf);
1105         return err;
1106 }
1107
1108 enum dso_type dso__type_fd(int fd)
1109 {
1110         enum dso_type dso_type = DSO__TYPE_UNKNOWN;
1111         GElf_Ehdr ehdr;
1112         Elf_Kind ek;
1113         Elf *elf;
1114
1115         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
1116         if (elf == NULL)
1117                 goto out;
1118
1119         ek = elf_kind(elf);
1120         if (ek != ELF_K_ELF)
1121                 goto out_end;
1122
1123         if (gelf_getclass(elf) == ELFCLASS64) {
1124                 dso_type = DSO__TYPE_64BIT;
1125                 goto out_end;
1126         }
1127
1128         if (gelf_getehdr(elf, &ehdr) == NULL)
1129                 goto out_end;
1130
1131         if (ehdr.e_machine == EM_X86_64)
1132                 dso_type = DSO__TYPE_X32BIT;
1133         else
1134                 dso_type = DSO__TYPE_32BIT;
1135 out_end:
1136         elf_end(elf);
1137 out:
1138         return dso_type;
1139 }
1140
1141 static int copy_bytes(int from, off_t from_offs, int to, off_t to_offs, u64 len)
1142 {
1143         ssize_t r;
1144         size_t n;
1145         int err = -1;
1146         char *buf = malloc(page_size);
1147
1148         if (buf == NULL)
1149                 return -1;
1150
1151         if (lseek(to, to_offs, SEEK_SET) != to_offs)
1152                 goto out;
1153
1154         if (lseek(from, from_offs, SEEK_SET) != from_offs)
1155                 goto out;
1156
1157         while (len) {
1158                 n = page_size;
1159                 if (len < n)
1160                         n = len;
1161                 /* Use read because mmap won't work on proc files */
1162                 r = read(from, buf, n);
1163                 if (r < 0)
1164                         goto out;
1165                 if (!r)
1166                         break;
1167                 n = r;
1168                 r = write(to, buf, n);
1169                 if (r < 0)
1170                         goto out;
1171                 if ((size_t)r != n)
1172                         goto out;
1173                 len -= n;
1174         }
1175
1176         err = 0;
1177 out:
1178         free(buf);
1179         return err;
1180 }
1181
1182 struct kcore {
1183         int fd;
1184         int elfclass;
1185         Elf *elf;
1186         GElf_Ehdr ehdr;
1187 };
1188
1189 static int kcore__open(struct kcore *kcore, const char *filename)
1190 {
1191         GElf_Ehdr *ehdr;
1192
1193         kcore->fd = open(filename, O_RDONLY);
1194         if (kcore->fd == -1)
1195                 return -1;
1196
1197         kcore->elf = elf_begin(kcore->fd, ELF_C_READ, NULL);
1198         if (!kcore->elf)
1199                 goto out_close;
1200
1201         kcore->elfclass = gelf_getclass(kcore->elf);
1202         if (kcore->elfclass == ELFCLASSNONE)
1203                 goto out_end;
1204
1205         ehdr = gelf_getehdr(kcore->elf, &kcore->ehdr);
1206         if (!ehdr)
1207                 goto out_end;
1208
1209         return 0;
1210
1211 out_end:
1212         elf_end(kcore->elf);
1213 out_close:
1214         close(kcore->fd);
1215         return -1;
1216 }
1217
1218 static int kcore__init(struct kcore *kcore, char *filename, int elfclass,
1219                        bool temp)
1220 {
1221         GElf_Ehdr *ehdr;
1222
1223         kcore->elfclass = elfclass;
1224
1225         if (temp)
1226                 kcore->fd = mkstemp(filename);
1227         else
1228                 kcore->fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0400);
1229         if (kcore->fd == -1)
1230                 return -1;
1231
1232         kcore->elf = elf_begin(kcore->fd, ELF_C_WRITE, NULL);
1233         if (!kcore->elf)
1234                 goto out_close;
1235
1236         if (!gelf_newehdr(kcore->elf, elfclass))
1237                 goto out_end;
1238
1239         ehdr = gelf_getehdr(kcore->elf, &kcore->ehdr);
1240         if (!ehdr)
1241                 goto out_end;
1242
1243         return 0;
1244
1245 out_end:
1246         elf_end(kcore->elf);
1247 out_close:
1248         close(kcore->fd);
1249         unlink(filename);
1250         return -1;
1251 }
1252
1253 static void kcore__close(struct kcore *kcore)
1254 {
1255         elf_end(kcore->elf);
1256         close(kcore->fd);
1257 }
1258
1259 static int kcore__copy_hdr(struct kcore *from, struct kcore *to, size_t count)
1260 {
1261         GElf_Ehdr *ehdr = &to->ehdr;
1262         GElf_Ehdr *kehdr = &from->ehdr;
1263
1264         memcpy(ehdr->e_ident, kehdr->e_ident, EI_NIDENT);
1265         ehdr->e_type      = kehdr->e_type;
1266         ehdr->e_machine   = kehdr->e_machine;
1267         ehdr->e_version   = kehdr->e_version;
1268         ehdr->e_entry     = 0;
1269         ehdr->e_shoff     = 0;
1270         ehdr->e_flags     = kehdr->e_flags;
1271         ehdr->e_phnum     = count;
1272         ehdr->e_shentsize = 0;
1273         ehdr->e_shnum     = 0;
1274         ehdr->e_shstrndx  = 0;
1275
1276         if (from->elfclass == ELFCLASS32) {
1277                 ehdr->e_phoff     = sizeof(Elf32_Ehdr);
1278                 ehdr->e_ehsize    = sizeof(Elf32_Ehdr);
1279                 ehdr->e_phentsize = sizeof(Elf32_Phdr);
1280         } else {
1281                 ehdr->e_phoff     = sizeof(Elf64_Ehdr);
1282                 ehdr->e_ehsize    = sizeof(Elf64_Ehdr);
1283                 ehdr->e_phentsize = sizeof(Elf64_Phdr);
1284         }
1285
1286         if (!gelf_update_ehdr(to->elf, ehdr))
1287                 return -1;
1288
1289         if (!gelf_newphdr(to->elf, count))
1290                 return -1;
1291
1292         return 0;
1293 }
1294
1295 static int kcore__add_phdr(struct kcore *kcore, int idx, off_t offset,
1296                            u64 addr, u64 len)
1297 {
1298         GElf_Phdr gphdr;
1299         GElf_Phdr *phdr;
1300
1301         phdr = gelf_getphdr(kcore->elf, idx, &gphdr);
1302         if (!phdr)
1303                 return -1;
1304
1305         phdr->p_type    = PT_LOAD;
1306         phdr->p_flags   = PF_R | PF_W | PF_X;
1307         phdr->p_offset  = offset;
1308         phdr->p_vaddr   = addr;
1309         phdr->p_paddr   = 0;
1310         phdr->p_filesz  = len;
1311         phdr->p_memsz   = len;
1312         phdr->p_align   = page_size;
1313
1314         if (!gelf_update_phdr(kcore->elf, idx, phdr))
1315                 return -1;
1316
1317         return 0;
1318 }
1319
1320 static off_t kcore__write(struct kcore *kcore)
1321 {
1322         return elf_update(kcore->elf, ELF_C_WRITE);
1323 }
1324
1325 struct phdr_data {
1326         off_t offset;
1327         u64 addr;
1328         u64 len;
1329 };
1330
1331 struct kcore_copy_info {
1332         u64 stext;
1333         u64 etext;
1334         u64 first_symbol;
1335         u64 last_symbol;
1336         u64 first_module;
1337         u64 last_module_symbol;
1338         struct phdr_data kernel_map;
1339         struct phdr_data modules_map;
1340 };
1341
1342 static int kcore_copy__process_kallsyms(void *arg, const char *name, char type,
1343                                         u64 start)
1344 {
1345         struct kcore_copy_info *kci = arg;
1346
1347         if (!symbol_type__is_a(type, MAP__FUNCTION))
1348                 return 0;
1349
1350         if (strchr(name, '[')) {
1351                 if (start > kci->last_module_symbol)
1352                         kci->last_module_symbol = start;
1353                 return 0;
1354         }
1355
1356         if (!kci->first_symbol || start < kci->first_symbol)
1357                 kci->first_symbol = start;
1358
1359         if (!kci->last_symbol || start > kci->last_symbol)
1360                 kci->last_symbol = start;
1361
1362         if (!strcmp(name, "_stext")) {
1363                 kci->stext = start;
1364                 return 0;
1365         }
1366
1367         if (!strcmp(name, "_etext")) {
1368                 kci->etext = start;
1369                 return 0;
1370         }
1371
1372         return 0;
1373 }
1374
1375 static int kcore_copy__parse_kallsyms(struct kcore_copy_info *kci,
1376                                       const char *dir)
1377 {
1378         char kallsyms_filename[PATH_MAX];
1379
1380         scnprintf(kallsyms_filename, PATH_MAX, "%s/kallsyms", dir);
1381
1382         if (symbol__restricted_filename(kallsyms_filename, "/proc/kallsyms"))
1383                 return -1;
1384
1385         if (kallsyms__parse(kallsyms_filename, kci,
1386                             kcore_copy__process_kallsyms) < 0)
1387                 return -1;
1388
1389         return 0;
1390 }
1391
1392 static int kcore_copy__process_modules(void *arg,
1393                                        const char *name __maybe_unused,
1394                                        u64 start)
1395 {
1396         struct kcore_copy_info *kci = arg;
1397
1398         if (!kci->first_module || start < kci->first_module)
1399                 kci->first_module = start;
1400
1401         return 0;
1402 }
1403
1404 static int kcore_copy__parse_modules(struct kcore_copy_info *kci,
1405                                      const char *dir)
1406 {
1407         char modules_filename[PATH_MAX];
1408
1409         scnprintf(modules_filename, PATH_MAX, "%s/modules", dir);
1410
1411         if (symbol__restricted_filename(modules_filename, "/proc/modules"))
1412                 return -1;
1413
1414         if (modules__parse(modules_filename, kci,
1415                            kcore_copy__process_modules) < 0)
1416                 return -1;
1417
1418         return 0;
1419 }
1420
1421 static void kcore_copy__map(struct phdr_data *p, u64 start, u64 end, u64 pgoff,
1422                             u64 s, u64 e)
1423 {
1424         if (p->addr || s < start || s >= end)
1425                 return;
1426
1427         p->addr = s;
1428         p->offset = (s - start) + pgoff;
1429         p->len = e < end ? e - s : end - s;
1430 }
1431
1432 static int kcore_copy__read_map(u64 start, u64 len, u64 pgoff, void *data)
1433 {
1434         struct kcore_copy_info *kci = data;
1435         u64 end = start + len;
1436
1437         kcore_copy__map(&kci->kernel_map, start, end, pgoff, kci->stext,
1438                         kci->etext);
1439
1440         kcore_copy__map(&kci->modules_map, start, end, pgoff, kci->first_module,
1441                         kci->last_module_symbol);
1442
1443         return 0;
1444 }
1445
1446 static int kcore_copy__read_maps(struct kcore_copy_info *kci, Elf *elf)
1447 {
1448         if (elf_read_maps(elf, true, kcore_copy__read_map, kci) < 0)
1449                 return -1;
1450
1451         return 0;
1452 }
1453
1454 static int kcore_copy__calc_maps(struct kcore_copy_info *kci, const char *dir,
1455                                  Elf *elf)
1456 {
1457         if (kcore_copy__parse_kallsyms(kci, dir))
1458                 return -1;
1459
1460         if (kcore_copy__parse_modules(kci, dir))
1461                 return -1;
1462
1463         if (kci->stext)
1464                 kci->stext = round_down(kci->stext, page_size);
1465         else
1466                 kci->stext = round_down(kci->first_symbol, page_size);
1467
1468         if (kci->etext) {
1469                 kci->etext = round_up(kci->etext, page_size);
1470         } else if (kci->last_symbol) {
1471                 kci->etext = round_up(kci->last_symbol, page_size);
1472                 kci->etext += page_size;
1473         }
1474
1475         kci->first_module = round_down(kci->first_module, page_size);
1476
1477         if (kci->last_module_symbol) {
1478                 kci->last_module_symbol = round_up(kci->last_module_symbol,
1479                                                    page_size);
1480                 kci->last_module_symbol += page_size;
1481         }
1482
1483         if (!kci->stext || !kci->etext)
1484                 return -1;
1485
1486         if (kci->first_module && !kci->last_module_symbol)
1487                 return -1;
1488
1489         return kcore_copy__read_maps(kci, elf);
1490 }
1491
1492 static int kcore_copy__copy_file(const char *from_dir, const char *to_dir,
1493                                  const char *name)
1494 {
1495         char from_filename[PATH_MAX];
1496         char to_filename[PATH_MAX];
1497
1498         scnprintf(from_filename, PATH_MAX, "%s/%s", from_dir, name);
1499         scnprintf(to_filename, PATH_MAX, "%s/%s", to_dir, name);
1500
1501         return copyfile_mode(from_filename, to_filename, 0400);
1502 }
1503
1504 static int kcore_copy__unlink(const char *dir, const char *name)
1505 {
1506         char filename[PATH_MAX];
1507
1508         scnprintf(filename, PATH_MAX, "%s/%s", dir, name);
1509
1510         return unlink(filename);
1511 }
1512
1513 static int kcore_copy__compare_fds(int from, int to)
1514 {
1515         char *buf_from;
1516         char *buf_to;
1517         ssize_t ret;
1518         size_t len;
1519         int err = -1;
1520
1521         buf_from = malloc(page_size);
1522         buf_to = malloc(page_size);
1523         if (!buf_from || !buf_to)
1524                 goto out;
1525
1526         while (1) {
1527                 /* Use read because mmap won't work on proc files */
1528                 ret = read(from, buf_from, page_size);
1529                 if (ret < 0)
1530                         goto out;
1531
1532                 if (!ret)
1533                         break;
1534
1535                 len = ret;
1536
1537                 if (readn(to, buf_to, len) != (int)len)
1538                         goto out;
1539
1540                 if (memcmp(buf_from, buf_to, len))
1541                         goto out;
1542         }
1543
1544         err = 0;
1545 out:
1546         free(buf_to);
1547         free(buf_from);
1548         return err;
1549 }
1550
1551 static int kcore_copy__compare_files(const char *from_filename,
1552                                      const char *to_filename)
1553 {
1554         int from, to, err = -1;
1555
1556         from = open(from_filename, O_RDONLY);
1557         if (from < 0)
1558                 return -1;
1559
1560         to = open(to_filename, O_RDONLY);
1561         if (to < 0)
1562                 goto out_close_from;
1563
1564         err = kcore_copy__compare_fds(from, to);
1565
1566         close(to);
1567 out_close_from:
1568         close(from);
1569         return err;
1570 }
1571
1572 static int kcore_copy__compare_file(const char *from_dir, const char *to_dir,
1573                                     const char *name)
1574 {
1575         char from_filename[PATH_MAX];
1576         char to_filename[PATH_MAX];
1577
1578         scnprintf(from_filename, PATH_MAX, "%s/%s", from_dir, name);
1579         scnprintf(to_filename, PATH_MAX, "%s/%s", to_dir, name);
1580
1581         return kcore_copy__compare_files(from_filename, to_filename);
1582 }
1583
1584 /**
1585  * kcore_copy - copy kallsyms, modules and kcore from one directory to another.
1586  * @from_dir: from directory
1587  * @to_dir: to directory
1588  *
1589  * This function copies kallsyms, modules and kcore files from one directory to
1590  * another.  kallsyms and modules are copied entirely.  Only code segments are
1591  * copied from kcore.  It is assumed that two segments suffice: one for the
1592  * kernel proper and one for all the modules.  The code segments are determined
1593  * from kallsyms and modules files.  The kernel map starts at _stext or the
1594  * lowest function symbol, and ends at _etext or the highest function symbol.
1595  * The module map starts at the lowest module address and ends at the highest
1596  * module symbol.  Start addresses are rounded down to the nearest page.  End
1597  * addresses are rounded up to the nearest page.  An extra page is added to the
1598  * highest kernel symbol and highest module symbol to, hopefully, encompass that
1599  * symbol too.  Because it contains only code sections, the resulting kcore is
1600  * unusual.  One significant peculiarity is that the mapping (start -> pgoff)
1601  * is not the same for the kernel map and the modules map.  That happens because
1602  * the data is copied adjacently whereas the original kcore has gaps.  Finally,
1603  * kallsyms and modules files are compared with their copies to check that
1604  * modules have not been loaded or unloaded while the copies were taking place.
1605  *
1606  * Return: %0 on success, %-1 on failure.
1607  */
1608 int kcore_copy(const char *from_dir, const char *to_dir)
1609 {
1610         struct kcore kcore;
1611         struct kcore extract;
1612         size_t count = 2;
1613         int idx = 0, err = -1;
1614         off_t offset = page_size, sz, modules_offset = 0;
1615         struct kcore_copy_info kci = { .stext = 0, };
1616         char kcore_filename[PATH_MAX];
1617         char extract_filename[PATH_MAX];
1618
1619         if (kcore_copy__copy_file(from_dir, to_dir, "kallsyms"))
1620                 return -1;
1621
1622         if (kcore_copy__copy_file(from_dir, to_dir, "modules"))
1623                 goto out_unlink_kallsyms;
1624
1625         scnprintf(kcore_filename, PATH_MAX, "%s/kcore", from_dir);
1626         scnprintf(extract_filename, PATH_MAX, "%s/kcore", to_dir);
1627
1628         if (kcore__open(&kcore, kcore_filename))
1629                 goto out_unlink_modules;
1630
1631         if (kcore_copy__calc_maps(&kci, from_dir, kcore.elf))
1632                 goto out_kcore_close;
1633
1634         if (kcore__init(&extract, extract_filename, kcore.elfclass, false))
1635                 goto out_kcore_close;
1636
1637         if (!kci.modules_map.addr)
1638                 count -= 1;
1639
1640         if (kcore__copy_hdr(&kcore, &extract, count))
1641                 goto out_extract_close;
1642
1643         if (kcore__add_phdr(&extract, idx++, offset, kci.kernel_map.addr,
1644                             kci.kernel_map.len))
1645                 goto out_extract_close;
1646
1647         if (kci.modules_map.addr) {
1648                 modules_offset = offset + kci.kernel_map.len;
1649                 if (kcore__add_phdr(&extract, idx, modules_offset,
1650                                     kci.modules_map.addr, kci.modules_map.len))
1651                         goto out_extract_close;
1652         }
1653
1654         sz = kcore__write(&extract);
1655         if (sz < 0 || sz > offset)
1656                 goto out_extract_close;
1657
1658         if (copy_bytes(kcore.fd, kci.kernel_map.offset, extract.fd, offset,
1659                        kci.kernel_map.len))
1660                 goto out_extract_close;
1661
1662         if (modules_offset && copy_bytes(kcore.fd, kci.modules_map.offset,
1663                                          extract.fd, modules_offset,
1664                                          kci.modules_map.len))
1665                 goto out_extract_close;
1666
1667         if (kcore_copy__compare_file(from_dir, to_dir, "modules"))
1668                 goto out_extract_close;
1669
1670         if (kcore_copy__compare_file(from_dir, to_dir, "kallsyms"))
1671                 goto out_extract_close;
1672
1673         err = 0;
1674
1675 out_extract_close:
1676         kcore__close(&extract);
1677         if (err)
1678                 unlink(extract_filename);
1679 out_kcore_close:
1680         kcore__close(&kcore);
1681 out_unlink_modules:
1682         if (err)
1683                 kcore_copy__unlink(to_dir, "modules");
1684 out_unlink_kallsyms:
1685         if (err)
1686                 kcore_copy__unlink(to_dir, "kallsyms");
1687
1688         return err;
1689 }
1690
1691 int kcore_extract__create(struct kcore_extract *kce)
1692 {
1693         struct kcore kcore;
1694         struct kcore extract;
1695         size_t count = 1;
1696         int idx = 0, err = -1;
1697         off_t offset = page_size, sz;
1698
1699         if (kcore__open(&kcore, kce->kcore_filename))
1700                 return -1;
1701
1702         strcpy(kce->extract_filename, PERF_KCORE_EXTRACT);
1703         if (kcore__init(&extract, kce->extract_filename, kcore.elfclass, true))
1704                 goto out_kcore_close;
1705
1706         if (kcore__copy_hdr(&kcore, &extract, count))
1707                 goto out_extract_close;
1708
1709         if (kcore__add_phdr(&extract, idx, offset, kce->addr, kce->len))
1710                 goto out_extract_close;
1711
1712         sz = kcore__write(&extract);
1713         if (sz < 0 || sz > offset)
1714                 goto out_extract_close;
1715
1716         if (copy_bytes(kcore.fd, kce->offs, extract.fd, offset, kce->len))
1717                 goto out_extract_close;
1718
1719         err = 0;
1720
1721 out_extract_close:
1722         kcore__close(&extract);
1723         if (err)
1724                 unlink(kce->extract_filename);
1725 out_kcore_close:
1726         kcore__close(&kcore);
1727
1728         return err;
1729 }
1730
1731 void kcore_extract__delete(struct kcore_extract *kce)
1732 {
1733         unlink(kce->extract_filename);
1734 }
1735
1736 void symbol__elf_init(void)
1737 {
1738         elf_version(EV_CURRENT);
1739 }