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