perf symbols: Fixup kernel_maps__fixup_end end map
[safe/jmp/linux-2.6] / tools / perf / util / symbol.c
1 #include "util.h"
2 #include "../perf.h"
3 #include "string.h"
4 #include "symbol.h"
5 #include "thread.h"
6
7 #include "debug.h"
8
9 #include <libelf.h>
10 #include <gelf.h>
11 #include <elf.h>
12 #include <limits.h>
13 #include <sys/utsname.h>
14
15 enum dso_origin {
16         DSO__ORIG_KERNEL = 0,
17         DSO__ORIG_JAVA_JIT,
18         DSO__ORIG_FEDORA,
19         DSO__ORIG_UBUNTU,
20         DSO__ORIG_BUILDID,
21         DSO__ORIG_DSO,
22         DSO__ORIG_KMODULE,
23         DSO__ORIG_NOT_FOUND,
24 };
25
26 static void dsos__add(struct dso *dso);
27 static struct dso *dsos__find(const char *name);
28 static struct map *map__new2(u64 start, struct dso *dso);
29 static void kernel_maps__insert(struct map *map);
30 static int dso__load_kernel_sym(struct dso *self, struct map *map,
31                                 symbol_filter_t filter);
32 unsigned int symbol__priv_size;
33
34 static struct rb_root kernel_maps;
35
36 static void dso__fixup_sym_end(struct dso *self)
37 {
38         struct rb_node *nd, *prevnd = rb_first(&self->syms);
39         struct symbol *curr, *prev;
40
41         if (prevnd == NULL)
42                 return;
43
44         curr = rb_entry(prevnd, struct symbol, rb_node);
45
46         for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
47                 prev = curr;
48                 curr = rb_entry(nd, struct symbol, rb_node);
49
50                 if (prev->end == prev->start)
51                         prev->end = curr->start - 1;
52         }
53
54         /* Last entry */
55         if (curr->end == curr->start)
56                 curr->end = roundup(curr->start, 4096);
57 }
58
59 static void kernel_maps__fixup_end(void)
60 {
61         struct map *prev, *curr;
62         struct rb_node *nd, *prevnd = rb_first(&kernel_maps);
63
64         if (prevnd == NULL)
65                 return;
66
67         curr = rb_entry(prevnd, struct map, rb_node);
68
69         for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
70                 prev = curr;
71                 curr = rb_entry(nd, struct map, rb_node);
72                 prev->end = curr->start - 1;
73         }
74
75         /*
76          * We still haven't the actual symbols, so guess the
77          * last map final address.
78          */
79         curr->end = ~0UL;
80 }
81
82 static struct symbol *symbol__new(u64 start, u64 len, const char *name)
83 {
84         size_t namelen = strlen(name) + 1;
85         struct symbol *self = calloc(1, (symbol__priv_size +
86                                          sizeof(*self) + namelen));
87         if (!self)
88                 return NULL;
89
90         if (symbol__priv_size) {
91                 memset(self, 0, symbol__priv_size);
92                 self = ((void *)self) + symbol__priv_size;
93         }
94         self->start = start;
95         self->end   = len ? start + len - 1 : start;
96
97         pr_debug3("%s: %s %#Lx-%#Lx\n", __func__, name, start, self->end);
98
99         memcpy(self->name, name, namelen);
100
101         return self;
102 }
103
104 static void symbol__delete(struct symbol *self)
105 {
106         free(((void *)self) - symbol__priv_size);
107 }
108
109 static size_t symbol__fprintf(struct symbol *self, FILE *fp)
110 {
111         return fprintf(fp, " %llx-%llx %s\n",
112                        self->start, self->end, self->name);
113 }
114
115 static void dso__set_long_name(struct dso *self, char *name)
116 {
117         if (name == NULL)
118                 return;
119         self->long_name = name;
120         self->long_name_len = strlen(name);
121 }
122
123 static void dso__set_basename(struct dso *self)
124 {
125         self->short_name = basename(self->long_name);
126 }
127
128 struct dso *dso__new(const char *name)
129 {
130         struct dso *self = malloc(sizeof(*self) + strlen(name) + 1);
131
132         if (self != NULL) {
133                 strcpy(self->name, name);
134                 dso__set_long_name(self, self->name);
135                 self->short_name = self->name;
136                 self->syms = RB_ROOT;
137                 self->find_symbol = dso__find_symbol;
138                 self->slen_calculated = 0;
139                 self->origin = DSO__ORIG_NOT_FOUND;
140                 self->loaded = 0;
141                 self->has_build_id = 0;
142         }
143
144         return self;
145 }
146
147 static void dso__delete_symbols(struct dso *self)
148 {
149         struct symbol *pos;
150         struct rb_node *next = rb_first(&self->syms);
151
152         while (next) {
153                 pos = rb_entry(next, struct symbol, rb_node);
154                 next = rb_next(&pos->rb_node);
155                 rb_erase(&pos->rb_node, &self->syms);
156                 symbol__delete(pos);
157         }
158 }
159
160 void dso__delete(struct dso *self)
161 {
162         dso__delete_symbols(self);
163         if (self->long_name != self->name)
164                 free(self->long_name);
165         free(self);
166 }
167
168 void dso__set_build_id(struct dso *self, void *build_id)
169 {
170         memcpy(self->build_id, build_id, sizeof(self->build_id));
171         self->has_build_id = 1;
172 }
173
174 static void dso__insert_symbol(struct dso *self, struct symbol *sym)
175 {
176         struct rb_node **p = &self->syms.rb_node;
177         struct rb_node *parent = NULL;
178         const u64 ip = sym->start;
179         struct symbol *s;
180
181         while (*p != NULL) {
182                 parent = *p;
183                 s = rb_entry(parent, struct symbol, rb_node);
184                 if (ip < s->start)
185                         p = &(*p)->rb_left;
186                 else
187                         p = &(*p)->rb_right;
188         }
189         rb_link_node(&sym->rb_node, parent, p);
190         rb_insert_color(&sym->rb_node, &self->syms);
191 }
192
193 struct symbol *dso__find_symbol(struct dso *self, u64 ip)
194 {
195         struct rb_node *n;
196
197         if (self == NULL)
198                 return NULL;
199
200         n = self->syms.rb_node;
201
202         while (n) {
203                 struct symbol *s = rb_entry(n, struct symbol, rb_node);
204
205                 if (ip < s->start)
206                         n = n->rb_left;
207                 else if (ip > s->end)
208                         n = n->rb_right;
209                 else
210                         return s;
211         }
212
213         return NULL;
214 }
215
216 int build_id__sprintf(u8 *self, int len, char *bf)
217 {
218         char *bid = bf;
219         u8 *raw = self;
220         int i;
221
222         for (i = 0; i < len; ++i) {
223                 sprintf(bid, "%02x", *raw);
224                 ++raw;
225                 bid += 2;
226         }
227
228         return raw - self;
229 }
230
231 size_t dso__fprintf_buildid(struct dso *self, FILE *fp)
232 {
233         char sbuild_id[BUILD_ID_SIZE * 2 + 1];
234
235         build_id__sprintf(self->build_id, sizeof(self->build_id), sbuild_id);
236         return fprintf(fp, "%s", sbuild_id);
237 }
238
239 size_t dso__fprintf(struct dso *self, FILE *fp)
240 {
241         struct rb_node *nd;
242         size_t ret = fprintf(fp, "dso: %s (", self->short_name);
243
244         ret += dso__fprintf_buildid(self, fp);
245         ret += fprintf(fp, ")\n");
246
247         for (nd = rb_first(&self->syms); nd; nd = rb_next(nd)) {
248                 struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
249                 ret += symbol__fprintf(pos, fp);
250         }
251
252         return ret;
253 }
254
255 /*
256  * Loads the function entries in /proc/kallsyms into kernel_map->dso,
257  * so that we can in the next step set the symbol ->end address and then
258  * call kernel_maps__split_kallsyms.
259  */
260 static int kernel_maps__load_all_kallsyms(void)
261 {
262         char *line = NULL;
263         size_t n;
264         FILE *file = fopen("/proc/kallsyms", "r");
265
266         if (file == NULL)
267                 goto out_failure;
268
269         while (!feof(file)) {
270                 u64 start;
271                 struct symbol *sym;
272                 int line_len, len;
273                 char symbol_type;
274                 char *symbol_name;
275
276                 line_len = getline(&line, &n, file);
277                 if (line_len < 0)
278                         break;
279
280                 if (!line)
281                         goto out_failure;
282
283                 line[--line_len] = '\0'; /* \n */
284
285                 len = hex2u64(line, &start);
286
287                 len++;
288                 if (len + 2 >= line_len)
289                         continue;
290
291                 symbol_type = toupper(line[len]);
292                 /*
293                  * We're interested only in code ('T'ext)
294                  */
295                 if (symbol_type != 'T' && symbol_type != 'W')
296                         continue;
297
298                 symbol_name = line + len + 2;
299                 /*
300                  * Will fix up the end later, when we have all symbols sorted.
301                  */
302                 sym = symbol__new(start, 0, symbol_name);
303
304                 if (sym == NULL)
305                         goto out_delete_line;
306
307                 /*
308                  * We will pass the symbols to the filter later, in
309                  * kernel_maps__split_kallsyms, when we have split the
310                  * maps per module
311                  */
312                 dso__insert_symbol(kernel_map->dso, sym);
313         }
314
315         free(line);
316         fclose(file);
317
318         return 0;
319
320 out_delete_line:
321         free(line);
322 out_failure:
323         return -1;
324 }
325
326 /*
327  * Split the symbols into maps, making sure there are no overlaps, i.e. the
328  * kernel range is broken in several maps, named [kernel].N, as we don't have
329  * the original ELF section names vmlinux have.
330  */
331 static int kernel_maps__split_kallsyms(symbol_filter_t filter)
332 {
333         struct map *map = kernel_map;
334         struct symbol *pos;
335         int count = 0;
336         struct rb_node *next = rb_first(&kernel_map->dso->syms);
337         int kernel_range = 0;
338
339         while (next) {
340                 char *module;
341
342                 pos = rb_entry(next, struct symbol, rb_node);
343                 next = rb_next(&pos->rb_node);
344
345                 module = strchr(pos->name, '\t');
346                 if (module) {
347                         *module++ = '\0';
348
349                         if (strcmp(map->dso->name, module)) {
350                                 map = kernel_maps__find_by_dso_name(module);
351                                 if (!map) {
352                                         pr_err("/proc/{kallsyms,modules} "
353                                                "inconsistency!\n");
354                                         return -1;
355                                 }
356                         }
357                         /*
358                          * So that we look just like we get from .ko files,
359                          * i.e. not prelinked, relative to map->start.
360                          */
361                         pos->start = map->map_ip(map, pos->start);
362                         pos->end   = map->map_ip(map, pos->end);
363                 } else if (map != kernel_map) {
364                         char dso_name[PATH_MAX];
365                         struct dso *dso;
366
367                         snprintf(dso_name, sizeof(dso_name), "[kernel].%d",
368                                  kernel_range++);
369
370                         dso = dso__new(dso_name);
371                         if (dso == NULL)
372                                 return -1;
373
374                         map = map__new2(pos->start, dso);
375                         if (map == NULL) {
376                                 dso__delete(dso);
377                                 return -1;
378                         }
379
380                         map->map_ip = map->unmap_ip = identity__map_ip;
381                         kernel_maps__insert(map);
382                         ++kernel_range;
383                 }
384
385                 if (filter && filter(map, pos)) {
386                         rb_erase(&pos->rb_node, &kernel_map->dso->syms);
387                         symbol__delete(pos);
388                 } else {
389                         if (map != kernel_map) {
390                                 rb_erase(&pos->rb_node, &kernel_map->dso->syms);
391                                 dso__insert_symbol(map->dso, pos);
392                         }
393                         count++;
394                 }
395         }
396
397         return count;
398 }
399
400
401 static int kernel_maps__load_kallsyms(symbol_filter_t filter)
402 {
403         if (kernel_maps__load_all_kallsyms())
404                 return -1;
405
406         dso__fixup_sym_end(kernel_map->dso);
407         kernel_map->dso->origin = DSO__ORIG_KERNEL;
408
409         return kernel_maps__split_kallsyms(filter);
410 }
411
412 size_t kernel_maps__fprintf(FILE *fp)
413 {
414         size_t printed = fprintf(fp, "Kernel maps:\n");
415         struct rb_node *nd;
416
417         for (nd = rb_first(&kernel_maps); nd; nd = rb_next(nd)) {
418                 struct map *pos = rb_entry(nd, struct map, rb_node);
419
420                 printed += fprintf(fp, "Map:");
421                 printed += map__fprintf(pos, fp);
422                 if (verbose > 1) {
423                         printed += dso__fprintf(pos->dso, fp);
424                         printed += fprintf(fp, "--\n");
425                 }
426         }
427
428         return printed + fprintf(fp, "END kernel maps\n");
429 }
430
431 static int dso__load_perf_map(struct dso *self, struct map *map,
432                               symbol_filter_t filter)
433 {
434         char *line = NULL;
435         size_t n;
436         FILE *file;
437         int nr_syms = 0;
438
439         file = fopen(self->long_name, "r");
440         if (file == NULL)
441                 goto out_failure;
442
443         while (!feof(file)) {
444                 u64 start, size;
445                 struct symbol *sym;
446                 int line_len, len;
447
448                 line_len = getline(&line, &n, file);
449                 if (line_len < 0)
450                         break;
451
452                 if (!line)
453                         goto out_failure;
454
455                 line[--line_len] = '\0'; /* \n */
456
457                 len = hex2u64(line, &start);
458
459                 len++;
460                 if (len + 2 >= line_len)
461                         continue;
462
463                 len += hex2u64(line + len, &size);
464
465                 len++;
466                 if (len + 2 >= line_len)
467                         continue;
468
469                 sym = symbol__new(start, size, line + len);
470
471                 if (sym == NULL)
472                         goto out_delete_line;
473
474                 if (filter && filter(map, sym))
475                         symbol__delete(sym);
476                 else {
477                         dso__insert_symbol(self, sym);
478                         nr_syms++;
479                 }
480         }
481
482         free(line);
483         fclose(file);
484
485         return nr_syms;
486
487 out_delete_line:
488         free(line);
489 out_failure:
490         return -1;
491 }
492
493 /**
494  * elf_symtab__for_each_symbol - iterate thru all the symbols
495  *
496  * @self: struct elf_symtab instance to iterate
497  * @idx: uint32_t idx
498  * @sym: GElf_Sym iterator
499  */
500 #define elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) \
501         for (idx = 0, gelf_getsym(syms, idx, &sym);\
502              idx < nr_syms; \
503              idx++, gelf_getsym(syms, idx, &sym))
504
505 static inline uint8_t elf_sym__type(const GElf_Sym *sym)
506 {
507         return GELF_ST_TYPE(sym->st_info);
508 }
509
510 static inline int elf_sym__is_function(const GElf_Sym *sym)
511 {
512         return elf_sym__type(sym) == STT_FUNC &&
513                sym->st_name != 0 &&
514                sym->st_shndx != SHN_UNDEF;
515 }
516
517 static inline int elf_sym__is_label(const GElf_Sym *sym)
518 {
519         return elf_sym__type(sym) == STT_NOTYPE &&
520                 sym->st_name != 0 &&
521                 sym->st_shndx != SHN_UNDEF &&
522                 sym->st_shndx != SHN_ABS;
523 }
524
525 static inline const char *elf_sec__name(const GElf_Shdr *shdr,
526                                         const Elf_Data *secstrs)
527 {
528         return secstrs->d_buf + shdr->sh_name;
529 }
530
531 static inline int elf_sec__is_text(const GElf_Shdr *shdr,
532                                         const Elf_Data *secstrs)
533 {
534         return strstr(elf_sec__name(shdr, secstrs), "text") != NULL;
535 }
536
537 static inline const char *elf_sym__name(const GElf_Sym *sym,
538                                         const Elf_Data *symstrs)
539 {
540         return symstrs->d_buf + sym->st_name;
541 }
542
543 static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
544                                     GElf_Shdr *shp, const char *name,
545                                     size_t *idx)
546 {
547         Elf_Scn *sec = NULL;
548         size_t cnt = 1;
549
550         while ((sec = elf_nextscn(elf, sec)) != NULL) {
551                 char *str;
552
553                 gelf_getshdr(sec, shp);
554                 str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name);
555                 if (!strcmp(name, str)) {
556                         if (idx)
557                                 *idx = cnt;
558                         break;
559                 }
560                 ++cnt;
561         }
562
563         return sec;
564 }
565
566 #define elf_section__for_each_rel(reldata, pos, pos_mem, idx, nr_entries) \
567         for (idx = 0, pos = gelf_getrel(reldata, 0, &pos_mem); \
568              idx < nr_entries; \
569              ++idx, pos = gelf_getrel(reldata, idx, &pos_mem))
570
571 #define elf_section__for_each_rela(reldata, pos, pos_mem, idx, nr_entries) \
572         for (idx = 0, pos = gelf_getrela(reldata, 0, &pos_mem); \
573              idx < nr_entries; \
574              ++idx, pos = gelf_getrela(reldata, idx, &pos_mem))
575
576 /*
577  * We need to check if we have a .dynsym, so that we can handle the
578  * .plt, synthesizing its symbols, that aren't on the symtabs (be it
579  * .dynsym or .symtab).
580  * And always look at the original dso, not at debuginfo packages, that
581  * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
582  */
583 static int dso__synthesize_plt_symbols(struct  dso *self, struct map *map,
584                                        symbol_filter_t filter)
585 {
586         uint32_t nr_rel_entries, idx;
587         GElf_Sym sym;
588         u64 plt_offset;
589         GElf_Shdr shdr_plt;
590         struct symbol *f;
591         GElf_Shdr shdr_rel_plt, shdr_dynsym;
592         Elf_Data *reldata, *syms, *symstrs;
593         Elf_Scn *scn_plt_rel, *scn_symstrs, *scn_dynsym;
594         size_t dynsym_idx;
595         GElf_Ehdr ehdr;
596         char sympltname[1024];
597         Elf *elf;
598         int nr = 0, symidx, fd, err = 0;
599
600         fd = open(self->long_name, O_RDONLY);
601         if (fd < 0)
602                 goto out;
603
604         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
605         if (elf == NULL)
606                 goto out_close;
607
608         if (gelf_getehdr(elf, &ehdr) == NULL)
609                 goto out_elf_end;
610
611         scn_dynsym = elf_section_by_name(elf, &ehdr, &shdr_dynsym,
612                                          ".dynsym", &dynsym_idx);
613         if (scn_dynsym == NULL)
614                 goto out_elf_end;
615
616         scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
617                                           ".rela.plt", NULL);
618         if (scn_plt_rel == NULL) {
619                 scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
620                                                   ".rel.plt", NULL);
621                 if (scn_plt_rel == NULL)
622                         goto out_elf_end;
623         }
624
625         err = -1;
626
627         if (shdr_rel_plt.sh_link != dynsym_idx)
628                 goto out_elf_end;
629
630         if (elf_section_by_name(elf, &ehdr, &shdr_plt, ".plt", NULL) == NULL)
631                 goto out_elf_end;
632
633         /*
634          * Fetch the relocation section to find the idxes to the GOT
635          * and the symbols in the .dynsym they refer to.
636          */
637         reldata = elf_getdata(scn_plt_rel, NULL);
638         if (reldata == NULL)
639                 goto out_elf_end;
640
641         syms = elf_getdata(scn_dynsym, NULL);
642         if (syms == NULL)
643                 goto out_elf_end;
644
645         scn_symstrs = elf_getscn(elf, shdr_dynsym.sh_link);
646         if (scn_symstrs == NULL)
647                 goto out_elf_end;
648
649         symstrs = elf_getdata(scn_symstrs, NULL);
650         if (symstrs == NULL)
651                 goto out_elf_end;
652
653         nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize;
654         plt_offset = shdr_plt.sh_offset;
655
656         if (shdr_rel_plt.sh_type == SHT_RELA) {
657                 GElf_Rela pos_mem, *pos;
658
659                 elf_section__for_each_rela(reldata, pos, pos_mem, idx,
660                                            nr_rel_entries) {
661                         symidx = GELF_R_SYM(pos->r_info);
662                         plt_offset += shdr_plt.sh_entsize;
663                         gelf_getsym(syms, symidx, &sym);
664                         snprintf(sympltname, sizeof(sympltname),
665                                  "%s@plt", elf_sym__name(&sym, symstrs));
666
667                         f = symbol__new(plt_offset, shdr_plt.sh_entsize,
668                                         sympltname);
669                         if (!f)
670                                 goto out_elf_end;
671
672                         if (filter && filter(map, f))
673                                 symbol__delete(f);
674                         else {
675                                 dso__insert_symbol(self, f);
676                                 ++nr;
677                         }
678                 }
679         } else if (shdr_rel_plt.sh_type == SHT_REL) {
680                 GElf_Rel pos_mem, *pos;
681                 elf_section__for_each_rel(reldata, pos, pos_mem, idx,
682                                           nr_rel_entries) {
683                         symidx = GELF_R_SYM(pos->r_info);
684                         plt_offset += shdr_plt.sh_entsize;
685                         gelf_getsym(syms, symidx, &sym);
686                         snprintf(sympltname, sizeof(sympltname),
687                                  "%s@plt", elf_sym__name(&sym, symstrs));
688
689                         f = symbol__new(plt_offset, shdr_plt.sh_entsize,
690                                         sympltname);
691                         if (!f)
692                                 goto out_elf_end;
693
694                         if (filter && filter(map, f))
695                                 symbol__delete(f);
696                         else {
697                                 dso__insert_symbol(self, f);
698                                 ++nr;
699                         }
700                 }
701         }
702
703         err = 0;
704 out_elf_end:
705         elf_end(elf);
706 out_close:
707         close(fd);
708
709         if (err == 0)
710                 return nr;
711 out:
712         pr_warning("%s: problems reading %s PLT info.\n",
713                    __func__, self->long_name);
714         return 0;
715 }
716
717 static int dso__load_sym(struct dso *self, struct map *map, const char *name,
718                          int fd, symbol_filter_t filter, int kernel,
719                          int kmodule)
720 {
721         struct map *curr_map = map;
722         struct dso *curr_dso = self;
723         size_t dso_name_len = strlen(self->short_name);
724         Elf_Data *symstrs, *secstrs;
725         uint32_t nr_syms;
726         int err = -1;
727         uint32_t idx;
728         GElf_Ehdr ehdr;
729         GElf_Shdr shdr;
730         Elf_Data *syms;
731         GElf_Sym sym;
732         Elf_Scn *sec, *sec_strndx;
733         Elf *elf;
734         int nr = 0;
735
736         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
737         if (elf == NULL) {
738                 pr_err("%s: cannot read %s ELF file.\n", __func__, name);
739                 goto out_close;
740         }
741
742         if (gelf_getehdr(elf, &ehdr) == NULL) {
743                 pr_err("%s: cannot get elf header.\n", __func__);
744                 goto out_elf_end;
745         }
746
747         sec = elf_section_by_name(elf, &ehdr, &shdr, ".symtab", NULL);
748         if (sec == NULL) {
749                 sec = elf_section_by_name(elf, &ehdr, &shdr, ".dynsym", NULL);
750                 if (sec == NULL)
751                         goto out_elf_end;
752         }
753
754         syms = elf_getdata(sec, NULL);
755         if (syms == NULL)
756                 goto out_elf_end;
757
758         sec = elf_getscn(elf, shdr.sh_link);
759         if (sec == NULL)
760                 goto out_elf_end;
761
762         symstrs = elf_getdata(sec, NULL);
763         if (symstrs == NULL)
764                 goto out_elf_end;
765
766         sec_strndx = elf_getscn(elf, ehdr.e_shstrndx);
767         if (sec_strndx == NULL)
768                 goto out_elf_end;
769
770         secstrs = elf_getdata(sec_strndx, NULL);
771         if (secstrs == NULL)
772                 goto out_elf_end;
773
774         nr_syms = shdr.sh_size / shdr.sh_entsize;
775
776         memset(&sym, 0, sizeof(sym));
777         if (!kernel) {
778                 self->adjust_symbols = (ehdr.e_type == ET_EXEC ||
779                                 elf_section_by_name(elf, &ehdr, &shdr,
780                                                      ".gnu.prelink_undo",
781                                                      NULL) != NULL);
782         } else self->adjust_symbols = 0;
783
784         elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
785                 struct symbol *f;
786                 const char *elf_name;
787                 char *demangled = NULL;
788                 int is_label = elf_sym__is_label(&sym);
789                 const char *section_name;
790
791                 if (!is_label && !elf_sym__is_function(&sym))
792                         continue;
793
794                 sec = elf_getscn(elf, sym.st_shndx);
795                 if (!sec)
796                         goto out_elf_end;
797
798                 gelf_getshdr(sec, &shdr);
799
800                 if (is_label && !elf_sec__is_text(&shdr, secstrs))
801                         continue;
802
803                 elf_name = elf_sym__name(&sym, symstrs);
804                 section_name = elf_sec__name(&shdr, secstrs);
805
806                 if (kernel || kmodule) {
807                         char dso_name[PATH_MAX];
808
809                         if (strcmp(section_name,
810                                    curr_dso->short_name + dso_name_len) == 0)
811                                 goto new_symbol;
812
813                         if (strcmp(section_name, ".text") == 0) {
814                                 curr_map = map;
815                                 curr_dso = self;
816                                 goto new_symbol;
817                         }
818
819                         snprintf(dso_name, sizeof(dso_name),
820                                  "%s%s", self->short_name, section_name);
821
822                         curr_map = kernel_maps__find_by_dso_name(dso_name);
823                         if (curr_map == NULL) {
824                                 u64 start = sym.st_value;
825
826                                 if (kmodule)
827                                         start += map->start + shdr.sh_offset;
828
829                                 curr_dso = dso__new(dso_name);
830                                 if (curr_dso == NULL)
831                                         goto out_elf_end;
832                                 curr_map = map__new2(start, curr_dso);
833                                 if (curr_map == NULL) {
834                                         dso__delete(curr_dso);
835                                         goto out_elf_end;
836                                 }
837                                 curr_map->map_ip = identity__map_ip;
838                                 curr_map->unmap_ip = identity__map_ip;
839                                 curr_dso->origin = DSO__ORIG_KERNEL;
840                                 kernel_maps__insert(curr_map);
841                                 dsos__add(curr_dso);
842                         } else
843                                 curr_dso = curr_map->dso;
844
845                         goto new_symbol;
846                 }
847
848                 if (curr_dso->adjust_symbols) {
849                         pr_debug2("adjusting symbol: st_value: %Lx sh_addr: "
850                                   "%Lx sh_offset: %Lx\n", (u64)sym.st_value,
851                                   (u64)shdr.sh_addr, (u64)shdr.sh_offset);
852                         sym.st_value -= shdr.sh_addr - shdr.sh_offset;
853                 }
854                 /*
855                  * We need to figure out if the object was created from C++ sources
856                  * DWARF DW_compile_unit has this, but we don't always have access
857                  * to it...
858                  */
859                 demangled = bfd_demangle(NULL, elf_name, DMGL_PARAMS | DMGL_ANSI);
860                 if (demangled != NULL)
861                         elf_name = demangled;
862 new_symbol:
863                 f = symbol__new(sym.st_value, sym.st_size, elf_name);
864                 free(demangled);
865                 if (!f)
866                         goto out_elf_end;
867
868                 if (filter && filter(curr_map, f))
869                         symbol__delete(f);
870                 else {
871                         dso__insert_symbol(curr_dso, f);
872                         nr++;
873                 }
874         }
875
876         /*
877          * For misannotated, zeroed, ASM function sizes.
878          */
879         if (nr > 0)
880                 dso__fixup_sym_end(self);
881         err = nr;
882 out_elf_end:
883         elf_end(elf);
884 out_close:
885         return err;
886 }
887
888 static bool dso__build_id_equal(const struct dso *self, u8 *build_id)
889 {
890         return memcmp(self->build_id, build_id, sizeof(self->build_id)) == 0;
891 }
892
893 bool dsos__read_build_ids(void)
894 {
895         bool have_build_id = false;
896         struct dso *pos;
897
898         list_for_each_entry(pos, &dsos, node)
899                 if (filename__read_build_id(pos->long_name, pos->build_id,
900                                             sizeof(pos->build_id)) > 0) {
901                         have_build_id     = true;
902                         pos->has_build_id = true;
903                 }
904
905         return have_build_id;
906 }
907
908 /*
909  * Align offset to 4 bytes as needed for note name and descriptor data.
910  */
911 #define NOTE_ALIGN(n) (((n) + 3) & -4U)
912
913 int filename__read_build_id(const char *filename, void *bf, size_t size)
914 {
915         int fd, err = -1;
916         GElf_Ehdr ehdr;
917         GElf_Shdr shdr;
918         Elf_Data *data;
919         Elf_Scn *sec;
920         void *ptr;
921         Elf *elf;
922
923         if (size < BUILD_ID_SIZE)
924                 goto out;
925
926         fd = open(filename, O_RDONLY);
927         if (fd < 0)
928                 goto out;
929
930         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
931         if (elf == NULL) {
932                 pr_debug2("%s: cannot read %s ELF file.\n", __func__, filename);
933                 goto out_close;
934         }
935
936         if (gelf_getehdr(elf, &ehdr) == NULL) {
937                 pr_err("%s: cannot get elf header.\n", __func__);
938                 goto out_elf_end;
939         }
940
941         sec = elf_section_by_name(elf, &ehdr, &shdr,
942                                   ".note.gnu.build-id", NULL);
943         if (sec == NULL) {
944                 sec = elf_section_by_name(elf, &ehdr, &shdr,
945                                           ".notes", NULL);
946                 if (sec == NULL)
947                         goto out_elf_end;
948         }
949
950         data = elf_getdata(sec, NULL);
951         if (data == NULL)
952                 goto out_elf_end;
953
954         ptr = data->d_buf;
955         while (ptr < (data->d_buf + data->d_size)) {
956                 GElf_Nhdr *nhdr = ptr;
957                 int namesz = NOTE_ALIGN(nhdr->n_namesz),
958                     descsz = NOTE_ALIGN(nhdr->n_descsz);
959                 const char *name;
960
961                 ptr += sizeof(*nhdr);
962                 name = ptr;
963                 ptr += namesz;
964                 if (nhdr->n_type == NT_GNU_BUILD_ID &&
965                     nhdr->n_namesz == sizeof("GNU")) {
966                         if (memcmp(name, "GNU", sizeof("GNU")) == 0) {
967                                 memcpy(bf, ptr, BUILD_ID_SIZE);
968                                 err = BUILD_ID_SIZE;
969                                 break;
970                         }
971                 }
972                 ptr += descsz;
973         }
974 out_elf_end:
975         elf_end(elf);
976 out_close:
977         close(fd);
978 out:
979         return err;
980 }
981
982 int sysfs__read_build_id(const char *filename, void *build_id, size_t size)
983 {
984         int fd, err = -1;
985
986         if (size < BUILD_ID_SIZE)
987                 goto out;
988
989         fd = open(filename, O_RDONLY);
990         if (fd < 0)
991                 goto out;
992
993         while (1) {
994                 char bf[BUFSIZ];
995                 GElf_Nhdr nhdr;
996                 int namesz, descsz;
997
998                 if (read(fd, &nhdr, sizeof(nhdr)) != sizeof(nhdr))
999                         break;
1000
1001                 namesz = NOTE_ALIGN(nhdr.n_namesz);
1002                 descsz = NOTE_ALIGN(nhdr.n_descsz);
1003                 if (nhdr.n_type == NT_GNU_BUILD_ID &&
1004                     nhdr.n_namesz == sizeof("GNU")) {
1005                         if (read(fd, bf, namesz) != namesz)
1006                                 break;
1007                         if (memcmp(bf, "GNU", sizeof("GNU")) == 0) {
1008                                 if (read(fd, build_id,
1009                                     BUILD_ID_SIZE) == BUILD_ID_SIZE) {
1010                                         err = 0;
1011                                         break;
1012                                 }
1013                         } else if (read(fd, bf, descsz) != descsz)
1014                                 break;
1015                 } else {
1016                         int n = namesz + descsz;
1017                         if (read(fd, bf, n) != n)
1018                                 break;
1019                 }
1020         }
1021         close(fd);
1022 out:
1023         return err;
1024 }
1025
1026 char dso__symtab_origin(const struct dso *self)
1027 {
1028         static const char origin[] = {
1029                 [DSO__ORIG_KERNEL] =   'k',
1030                 [DSO__ORIG_JAVA_JIT] = 'j',
1031                 [DSO__ORIG_FEDORA] =   'f',
1032                 [DSO__ORIG_UBUNTU] =   'u',
1033                 [DSO__ORIG_BUILDID] =  'b',
1034                 [DSO__ORIG_DSO] =      'd',
1035                 [DSO__ORIG_KMODULE] =  'K',
1036         };
1037
1038         if (self == NULL || self->origin == DSO__ORIG_NOT_FOUND)
1039                 return '!';
1040         return origin[self->origin];
1041 }
1042
1043 int dso__load(struct dso *self, struct map *map, symbol_filter_t filter)
1044 {
1045         int size = PATH_MAX;
1046         char *name;
1047         u8 build_id[BUILD_ID_SIZE];
1048         int ret = -1;
1049         int fd;
1050
1051         self->loaded = 1;
1052
1053         if (self->kernel)
1054                 return dso__load_kernel_sym(self, map, filter);
1055
1056         name = malloc(size);
1057         if (!name)
1058                 return -1;
1059
1060         self->adjust_symbols = 0;
1061
1062         if (strncmp(self->name, "/tmp/perf-", 10) == 0) {
1063                 ret = dso__load_perf_map(self, map, filter);
1064                 self->origin = ret > 0 ? DSO__ORIG_JAVA_JIT :
1065                                          DSO__ORIG_NOT_FOUND;
1066                 return ret;
1067         }
1068
1069         self->origin = DSO__ORIG_FEDORA - 1;
1070
1071 more:
1072         do {
1073                 self->origin++;
1074                 switch (self->origin) {
1075                 case DSO__ORIG_FEDORA:
1076                         snprintf(name, size, "/usr/lib/debug%s.debug",
1077                                  self->long_name);
1078                         break;
1079                 case DSO__ORIG_UBUNTU:
1080                         snprintf(name, size, "/usr/lib/debug%s",
1081                                  self->long_name);
1082                         break;
1083                 case DSO__ORIG_BUILDID:
1084                         if (filename__read_build_id(self->long_name, build_id,
1085                                                     sizeof(build_id))) {
1086                                 char build_id_hex[BUILD_ID_SIZE * 2 + 1];
1087
1088                                 build_id__sprintf(build_id, sizeof(build_id),
1089                                                   build_id_hex);
1090                                 snprintf(name, size,
1091                                          "/usr/lib/debug/.build-id/%.2s/%s.debug",
1092                                         build_id_hex, build_id_hex + 2);
1093                                 if (self->has_build_id)
1094                                         goto compare_build_id;
1095                                 break;
1096                         }
1097                         self->origin++;
1098                         /* Fall thru */
1099                 case DSO__ORIG_DSO:
1100                         snprintf(name, size, "%s", self->long_name);
1101                         break;
1102
1103                 default:
1104                         goto out;
1105                 }
1106
1107                 if (self->has_build_id) {
1108                         if (filename__read_build_id(name, build_id,
1109                                                     sizeof(build_id)) < 0)
1110                                 goto more;
1111 compare_build_id:
1112                         if (!dso__build_id_equal(self, build_id))
1113                                 goto more;
1114                 }
1115
1116                 fd = open(name, O_RDONLY);
1117         } while (fd < 0);
1118
1119         ret = dso__load_sym(self, map, name, fd, filter, 0, 0);
1120         close(fd);
1121
1122         /*
1123          * Some people seem to have debuginfo files _WITHOUT_ debug info!?!?
1124          */
1125         if (!ret)
1126                 goto more;
1127
1128         if (ret > 0) {
1129                 int nr_plt = dso__synthesize_plt_symbols(self, map, filter);
1130                 if (nr_plt > 0)
1131                         ret += nr_plt;
1132         }
1133 out:
1134         free(name);
1135         if (ret < 0 && strstr(self->name, " (deleted)") != NULL)
1136                 return 0;
1137         return ret;
1138 }
1139
1140 struct map *kernel_map;
1141
1142 static void kernel_maps__insert(struct map *map)
1143 {
1144         maps__insert(&kernel_maps, map);
1145 }
1146
1147 struct symbol *kernel_maps__find_symbol(u64 ip, struct map **mapp,
1148                                         symbol_filter_t filter)
1149 {
1150         struct map *map = maps__find(&kernel_maps, ip);
1151
1152         if (mapp)
1153                 *mapp = map;
1154
1155         if (map) {
1156                 ip = map->map_ip(map, ip);
1157                 return map__find_symbol(map, ip, filter);
1158         }
1159
1160         return NULL;
1161 }
1162
1163 struct map *kernel_maps__find_by_dso_name(const char *name)
1164 {
1165         struct rb_node *nd;
1166
1167         for (nd = rb_first(&kernel_maps); nd; nd = rb_next(nd)) {
1168                 struct map *map = rb_entry(nd, struct map, rb_node);
1169
1170                 if (map->dso && strcmp(map->dso->name, name) == 0)
1171                         return map;
1172         }
1173
1174         return NULL;
1175 }
1176
1177 static int dsos__set_modules_path_dir(char *dirname)
1178 {
1179         struct dirent *dent;
1180         DIR *dir = opendir(dirname);
1181
1182         if (!dir) {
1183                 pr_err("%s: cannot open %s dir\n", __func__, dirname);
1184                 return -1;
1185         }
1186
1187         while ((dent = readdir(dir)) != NULL) {
1188                 char path[PATH_MAX];
1189
1190                 if (dent->d_type == DT_DIR) {
1191                         if (!strcmp(dent->d_name, ".") ||
1192                             !strcmp(dent->d_name, ".."))
1193                                 continue;
1194
1195                         snprintf(path, sizeof(path), "%s/%s",
1196                                  dirname, dent->d_name);
1197                         if (dsos__set_modules_path_dir(path) < 0)
1198                                 goto failure;
1199                 } else {
1200                         char *dot = strrchr(dent->d_name, '.'),
1201                              dso_name[PATH_MAX];
1202                         struct map *map;
1203                         char *long_name;
1204
1205                         if (dot == NULL || strcmp(dot, ".ko"))
1206                                 continue;
1207                         snprintf(dso_name, sizeof(dso_name), "[%.*s]",
1208                                  (int)(dot - dent->d_name), dent->d_name);
1209
1210                         strxfrchar(dso_name, '-', '_');
1211                         map = kernel_maps__find_by_dso_name(dso_name);
1212                         if (map == NULL)
1213                                 continue;
1214
1215                         snprintf(path, sizeof(path), "%s/%s",
1216                                  dirname, dent->d_name);
1217
1218                         long_name = strdup(path);
1219                         if (long_name == NULL)
1220                                 goto failure;
1221                         dso__set_long_name(map->dso, long_name);
1222                 }
1223         }
1224
1225         return 0;
1226 failure:
1227         closedir(dir);
1228         return -1;
1229 }
1230
1231 static int dsos__set_modules_path(void)
1232 {
1233         struct utsname uts;
1234         char modules_path[PATH_MAX];
1235
1236         if (uname(&uts) < 0)
1237                 return -1;
1238
1239         snprintf(modules_path, sizeof(modules_path), "/lib/modules/%s/kernel",
1240                  uts.release);
1241
1242         return dsos__set_modules_path_dir(modules_path);
1243 }
1244
1245 /*
1246  * Constructor variant for modules (where we know from /proc/modules where
1247  * they are loaded) and for vmlinux, where only after we load all the
1248  * symbols we'll know where it starts and ends.
1249  */
1250 static struct map *map__new2(u64 start, struct dso *dso)
1251 {
1252         struct map *self = malloc(sizeof(*self));
1253
1254         if (self != NULL) {
1255                 /*
1256                  * ->end will be filled after we load all the symbols
1257                  */
1258                 map__init(self, start, 0, 0, dso);
1259         }
1260
1261         return self;
1262 }
1263
1264 static int kernel_maps__create_module_maps(void)
1265 {
1266         char *line = NULL;
1267         size_t n;
1268         FILE *file = fopen("/proc/modules", "r");
1269         struct map *map;
1270
1271         if (file == NULL)
1272                 return -1;
1273
1274         while (!feof(file)) {
1275                 char name[PATH_MAX];
1276                 u64 start;
1277                 struct dso *dso;
1278                 char *sep;
1279                 int line_len;
1280
1281                 line_len = getline(&line, &n, file);
1282                 if (line_len < 0)
1283                         break;
1284
1285                 if (!line)
1286                         goto out_failure;
1287
1288                 line[--line_len] = '\0'; /* \n */
1289
1290                 sep = strrchr(line, 'x');
1291                 if (sep == NULL)
1292                         continue;
1293
1294                 hex2u64(sep + 1, &start);
1295
1296                 sep = strchr(line, ' ');
1297                 if (sep == NULL)
1298                         continue;
1299
1300                 *sep = '\0';
1301
1302                 snprintf(name, sizeof(name), "[%s]", line);
1303                 dso = dso__new(name);
1304
1305                 if (dso == NULL)
1306                         goto out_delete_line;
1307
1308                 map = map__new2(start, dso);
1309                 if (map == NULL) {
1310                         dso__delete(dso);
1311                         goto out_delete_line;
1312                 }
1313
1314                 snprintf(name, sizeof(name),
1315                          "/sys/module/%s/notes/.note.gnu.build-id", line);
1316                 if (sysfs__read_build_id(name, dso->build_id,
1317                                          sizeof(dso->build_id)) == 0)
1318                         dso->has_build_id = true;
1319
1320                 dso->origin = DSO__ORIG_KMODULE;
1321                 kernel_maps__insert(map);
1322                 dsos__add(dso);
1323         }
1324
1325         free(line);
1326         fclose(file);
1327
1328         return dsos__set_modules_path();
1329
1330 out_delete_line:
1331         free(line);
1332 out_failure:
1333         return -1;
1334 }
1335
1336 static int dso__load_vmlinux(struct dso *self, struct map *map,
1337                              const char *vmlinux, symbol_filter_t filter)
1338 {
1339         int err = -1, fd;
1340
1341         if (self->has_build_id) {
1342                 u8 build_id[BUILD_ID_SIZE];
1343
1344                 if (filename__read_build_id(vmlinux, build_id,
1345                                             sizeof(build_id)) < 0) {
1346                         pr_debug("No build_id in %s, ignoring it\n", vmlinux);
1347                         return -1;
1348                 }
1349                 if (!dso__build_id_equal(self, build_id)) {
1350                         char expected_build_id[BUILD_ID_SIZE * 2 + 1],
1351                              vmlinux_build_id[BUILD_ID_SIZE * 2 + 1];
1352
1353                         build_id__sprintf(self->build_id,
1354                                           sizeof(self->build_id),
1355                                           expected_build_id);
1356                         build_id__sprintf(build_id, sizeof(build_id),
1357                                           vmlinux_build_id);
1358                         pr_debug("build_id in %s is %s while expected is %s, "
1359                                  "ignoring it\n", vmlinux, vmlinux_build_id,
1360                                  expected_build_id);
1361                         return -1;
1362                 }
1363         }
1364
1365         fd = open(vmlinux, O_RDONLY);
1366         if (fd < 0)
1367                 return -1;
1368
1369         self->loaded = 1;
1370         err = dso__load_sym(self, map, self->long_name, fd, filter, 1, 0);
1371
1372         close(fd);
1373
1374         return err;
1375 }
1376
1377 static int dso__load_kernel_sym(struct dso *self, struct map *map,
1378                                 symbol_filter_t filter)
1379 {
1380         int err = dso__load_vmlinux(self, map, self->name, filter);
1381
1382         if (err <= 0) {
1383                 err = kernel_maps__load_kallsyms(filter);
1384                 if (err > 0)
1385                         dso__set_long_name(self, strdup("[kernel.kallsyms]"));
1386         }
1387
1388         if (err > 0) {
1389                 map__fixup_start(map);
1390                 map__fixup_end(map);
1391         }
1392
1393         return err;
1394 }
1395
1396 LIST_HEAD(dsos);
1397 struct dso      *vdso;
1398
1399 const char      *vmlinux_name = "vmlinux";
1400
1401 static void dsos__add(struct dso *dso)
1402 {
1403         list_add_tail(&dso->node, &dsos);
1404 }
1405
1406 static struct dso *dsos__find(const char *name)
1407 {
1408         struct dso *pos;
1409
1410         list_for_each_entry(pos, &dsos, node)
1411                 if (strcmp(pos->name, name) == 0)
1412                         return pos;
1413         return NULL;
1414 }
1415
1416 struct dso *dsos__findnew(const char *name)
1417 {
1418         struct dso *dso = dsos__find(name);
1419
1420         if (!dso) {
1421                 dso = dso__new(name);
1422                 if (dso != NULL) {
1423                         dsos__add(dso);
1424                         dso__set_basename(dso);
1425                 }
1426         }
1427
1428         return dso;
1429 }
1430
1431 void dsos__fprintf(FILE *fp)
1432 {
1433         struct dso *pos;
1434
1435         list_for_each_entry(pos, &dsos, node)
1436                 dso__fprintf(pos, fp);
1437 }
1438
1439 size_t dsos__fprintf_buildid(FILE *fp)
1440 {
1441         struct dso *pos;
1442         size_t ret = 0;
1443
1444         list_for_each_entry(pos, &dsos, node) {
1445                 ret += dso__fprintf_buildid(pos, fp);
1446                 ret += fprintf(fp, " %s\n", pos->long_name);
1447         }
1448         return ret;
1449 }
1450
1451 static int kernel_maps__create_kernel_map(void)
1452 {
1453         struct dso *kernel = dso__new(vmlinux_name);
1454
1455         if (kernel == NULL)
1456                 return -1;
1457
1458         kernel_map = map__new2(0, kernel);
1459         if (kernel_map == NULL)
1460                 goto out_delete_kernel_dso;
1461
1462         kernel_map->map_ip = kernel_map->unmap_ip = identity__map_ip;
1463
1464         kernel->short_name = "[kernel]";
1465         kernel->kernel = 1;
1466         vdso = dso__new("[vdso]");
1467         if (vdso == NULL)
1468                 goto out_delete_kernel_map;
1469
1470         if (sysfs__read_build_id("/sys/kernel/notes", kernel->build_id,
1471                                  sizeof(kernel->build_id)) == 0)
1472                 kernel->has_build_id = true;
1473
1474         kernel_maps__insert(kernel_map);
1475         dsos__add(kernel);
1476         dsos__add(vdso);
1477
1478         return 0;
1479
1480 out_delete_kernel_map:
1481         map__delete(kernel_map);
1482         kernel_map = NULL;
1483 out_delete_kernel_dso:
1484         dso__delete(kernel);
1485         return -1;
1486 }
1487
1488 int kernel_maps__init(bool use_modules)
1489 {
1490         if (kernel_maps__create_kernel_map() < 0)
1491                 return -1;
1492
1493         if (use_modules && kernel_maps__create_module_maps() < 0)
1494                 pr_warning("Failed to load list of modules in use, "
1495                            "continuing...\n");
1496         /*
1497          * Now that we have all the maps created, just set the ->end of them:
1498          */
1499         kernel_maps__fixup_end();
1500         return 0;
1501 }
1502
1503 void symbol__init(unsigned int priv_size)
1504 {
1505         elf_version(EV_CURRENT);
1506         symbol__priv_size = priv_size;
1507 }