c0a028c3ebaf35905e99e69f4cef76e5e343f44f
[linux-flexiantxendom0-3.2.10.git] / tools / perf / util / symbol.c
1 #include <dirent.h>
2 #include <errno.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <sys/param.h>
9 #include <fcntl.h>
10 #include <unistd.h>
11 #include <inttypes.h>
12 #include "build-id.h"
13 #include "util.h"
14 #include "debug.h"
15 #include "symbol.h"
16 #include "strlist.h"
17
18 #include <libelf.h>
19 #include <gelf.h>
20 #include <elf.h>
21 #include <limits.h>
22 #include <sys/utsname.h>
23
24 #ifndef KSYM_NAME_LEN
25 #define KSYM_NAME_LEN 256
26 #endif
27
28 #ifndef NT_GNU_BUILD_ID
29 #define NT_GNU_BUILD_ID 3
30 #endif
31
32 static bool dso__build_id_equal(const struct dso *dso, u8 *build_id);
33 static int elf_read_build_id(Elf *elf, void *bf, size_t size);
34 static void dsos__add(struct list_head *head, struct dso *dso);
35 static struct map *map__new2(u64 start, struct dso *dso, enum map_type type);
36 static int dso__load_kernel_sym(struct dso *dso, struct map *map,
37                                 symbol_filter_t filter);
38 static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
39                         symbol_filter_t filter);
40 static int vmlinux_path__nr_entries;
41 static char **vmlinux_path;
42
43 struct symbol_conf symbol_conf = {
44         .exclude_other    = true,
45         .use_modules      = true,
46         .try_vmlinux_path = true,
47         .annotate_src     = true,
48         .symfs            = "",
49 };
50
51 int dso__name_len(const struct dso *dso)
52 {
53         if (!dso)
54                 return strlen("[unknown]");
55         if (verbose)
56                 return dso->long_name_len;
57
58         return dso->short_name_len;
59 }
60
61 bool dso__loaded(const struct dso *dso, enum map_type type)
62 {
63         return dso->loaded & (1 << type);
64 }
65
66 bool dso__sorted_by_name(const struct dso *dso, enum map_type type)
67 {
68         return dso->sorted_by_name & (1 << type);
69 }
70
71 static void dso__set_sorted_by_name(struct dso *dso, enum map_type type)
72 {
73         dso->sorted_by_name |= (1 << type);
74 }
75
76 bool symbol_type__is_a(char symbol_type, enum map_type map_type)
77 {
78         symbol_type = toupper(symbol_type);
79
80         switch (map_type) {
81         case MAP__FUNCTION:
82                 return symbol_type == 'T' || symbol_type == 'W';
83         case MAP__VARIABLE:
84                 return symbol_type == 'D';
85         default:
86                 return false;
87         }
88 }
89
90 static int prefix_underscores_count(const char *str)
91 {
92         const char *tail = str;
93
94         while (*tail == '_')
95                 tail++;
96
97         return tail - str;
98 }
99
100 #define SYMBOL_A 0
101 #define SYMBOL_B 1
102
103 static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
104 {
105         s64 a;
106         s64 b;
107
108         /* Prefer a symbol with non zero length */
109         a = syma->end - syma->start;
110         b = symb->end - symb->start;
111         if ((b == 0) && (a > 0))
112                 return SYMBOL_A;
113         else if ((a == 0) && (b > 0))
114                 return SYMBOL_B;
115
116         /* Prefer a non weak symbol over a weak one */
117         a = syma->binding == STB_WEAK;
118         b = symb->binding == STB_WEAK;
119         if (b && !a)
120                 return SYMBOL_A;
121         if (a && !b)
122                 return SYMBOL_B;
123
124         /* Prefer a global symbol over a non global one */
125         a = syma->binding == STB_GLOBAL;
126         b = symb->binding == STB_GLOBAL;
127         if (a && !b)
128                 return SYMBOL_A;
129         if (b && !a)
130                 return SYMBOL_B;
131
132         /* Prefer a symbol with less underscores */
133         a = prefix_underscores_count(syma->name);
134         b = prefix_underscores_count(symb->name);
135         if (b > a)
136                 return SYMBOL_A;
137         else if (a > b)
138                 return SYMBOL_B;
139
140         /* If all else fails, choose the symbol with the longest name */
141         if (strlen(syma->name) >= strlen(symb->name))
142                 return SYMBOL_A;
143         else
144                 return SYMBOL_B;
145 }
146
147 static void symbols__fixup_duplicate(struct rb_root *symbols)
148 {
149         struct rb_node *nd;
150         struct symbol *curr, *next;
151
152         nd = rb_first(symbols);
153
154         while (nd) {
155                 curr = rb_entry(nd, struct symbol, rb_node);
156 again:
157                 nd = rb_next(&curr->rb_node);
158                 next = rb_entry(nd, struct symbol, rb_node);
159
160                 if (!nd)
161                         break;
162
163                 if (curr->start != next->start)
164                         continue;
165
166                 if (choose_best_symbol(curr, next) == SYMBOL_A) {
167                         rb_erase(&next->rb_node, symbols);
168                         goto again;
169                 } else {
170                         nd = rb_next(&curr->rb_node);
171                         rb_erase(&curr->rb_node, symbols);
172                 }
173         }
174 }
175
176 static void symbols__fixup_end(struct rb_root *symbols)
177 {
178         struct rb_node *nd, *prevnd = rb_first(symbols);
179         struct symbol *curr, *prev;
180
181         if (prevnd == NULL)
182                 return;
183
184         curr = rb_entry(prevnd, struct symbol, rb_node);
185
186         for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
187                 prev = curr;
188                 curr = rb_entry(nd, struct symbol, rb_node);
189
190                 if (prev->end == prev->start && prev->end != curr->start)
191                         prev->end = curr->start - 1;
192         }
193
194         /* Last entry */
195         if (curr->end == curr->start)
196                 curr->end = roundup(curr->start, 4096);
197 }
198
199 static void __map_groups__fixup_end(struct map_groups *mg, enum map_type type)
200 {
201         struct map *prev, *curr;
202         struct rb_node *nd, *prevnd = rb_first(&mg->maps[type]);
203
204         if (prevnd == NULL)
205                 return;
206
207         curr = rb_entry(prevnd, struct map, rb_node);
208
209         for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
210                 prev = curr;
211                 curr = rb_entry(nd, struct map, rb_node);
212                 prev->end = curr->start - 1;
213         }
214
215         /*
216          * We still haven't the actual symbols, so guess the
217          * last map final address.
218          */
219         curr->end = ~0ULL;
220 }
221
222 static void map_groups__fixup_end(struct map_groups *mg)
223 {
224         int i;
225         for (i = 0; i < MAP__NR_TYPES; ++i)
226                 __map_groups__fixup_end(mg, i);
227 }
228
229 static struct symbol *symbol__new(u64 start, u64 len, u8 binding,
230                                   const char *name)
231 {
232         size_t namelen = strlen(name) + 1;
233         struct symbol *sym = calloc(1, (symbol_conf.priv_size +
234                                         sizeof(*sym) + namelen));
235         if (sym == NULL)
236                 return NULL;
237
238         if (symbol_conf.priv_size)
239                 sym = ((void *)sym) + symbol_conf.priv_size;
240
241         sym->start   = start;
242         sym->end     = len ? start + len - 1 : start;
243         sym->binding = binding;
244         sym->namelen = namelen - 1;
245
246         pr_debug4("%s: %s %#" PRIx64 "-%#" PRIx64 "\n",
247                   __func__, name, start, sym->end);
248         memcpy(sym->name, name, namelen);
249
250         return sym;
251 }
252
253 void symbol__delete(struct symbol *sym)
254 {
255         free(((void *)sym) - symbol_conf.priv_size);
256 }
257
258 static size_t symbol__fprintf(struct symbol *sym, FILE *fp)
259 {
260         return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %c %s\n",
261                        sym->start, sym->end,
262                        sym->binding == STB_GLOBAL ? 'g' :
263                        sym->binding == STB_LOCAL  ? 'l' : 'w',
264                        sym->name);
265 }
266
267 size_t symbol__fprintf_symname_offs(const struct symbol *sym,
268                                     const struct addr_location *al, FILE *fp)
269 {
270         unsigned long offset;
271         size_t length;
272
273         if (sym && sym->name) {
274                 length = fprintf(fp, "%s", sym->name);
275                 if (al) {
276                         offset = al->addr - sym->start;
277                         length += fprintf(fp, "+0x%lx", offset);
278                 }
279                 return length;
280         } else
281                 return fprintf(fp, "[unknown]");
282 }
283
284 size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp)
285 {
286         return symbol__fprintf_symname_offs(sym, NULL, fp);
287 }
288
289 void dso__set_long_name(struct dso *dso, char *name)
290 {
291         if (name == NULL)
292                 return;
293         dso->long_name = name;
294         dso->long_name_len = strlen(name);
295 }
296
297 static void dso__set_short_name(struct dso *dso, const char *name)
298 {
299         if (name == NULL)
300                 return;
301         dso->short_name = name;
302         dso->short_name_len = strlen(name);
303 }
304
305 static void dso__set_basename(struct dso *dso)
306 {
307         dso__set_short_name(dso, basename(dso->long_name));
308 }
309
310 struct dso *dso__new(const char *name)
311 {
312         struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1);
313
314         if (dso != NULL) {
315                 int i;
316                 strcpy(dso->name, name);
317                 dso__set_long_name(dso, dso->name);
318                 dso__set_short_name(dso, dso->name);
319                 for (i = 0; i < MAP__NR_TYPES; ++i)
320                         dso->symbols[i] = dso->symbol_names[i] = RB_ROOT;
321                 dso->symtab_type = SYMTAB__NOT_FOUND;
322                 dso->loaded = 0;
323                 dso->sorted_by_name = 0;
324                 dso->has_build_id = 0;
325                 dso->kernel = DSO_TYPE_USER;
326                 INIT_LIST_HEAD(&dso->node);
327         }
328
329         return dso;
330 }
331
332 static void symbols__delete(struct rb_root *symbols)
333 {
334         struct symbol *pos;
335         struct rb_node *next = rb_first(symbols);
336
337         while (next) {
338                 pos = rb_entry(next, struct symbol, rb_node);
339                 next = rb_next(&pos->rb_node);
340                 rb_erase(&pos->rb_node, symbols);
341                 symbol__delete(pos);
342         }
343 }
344
345 void dso__delete(struct dso *dso)
346 {
347         int i;
348         for (i = 0; i < MAP__NR_TYPES; ++i)
349                 symbols__delete(&dso->symbols[i]);
350         if (dso->sname_alloc)
351                 free((char *)dso->short_name);
352         if (dso->lname_alloc)
353                 free(dso->long_name);
354         free(dso);
355 }
356
357 void dso__set_build_id(struct dso *dso, void *build_id)
358 {
359         memcpy(dso->build_id, build_id, sizeof(dso->build_id));
360         dso->has_build_id = 1;
361 }
362
363 static void symbols__insert(struct rb_root *symbols, struct symbol *sym)
364 {
365         struct rb_node **p = &symbols->rb_node;
366         struct rb_node *parent = NULL;
367         const u64 ip = sym->start;
368         struct symbol *s;
369
370         while (*p != NULL) {
371                 parent = *p;
372                 s = rb_entry(parent, struct symbol, rb_node);
373                 if (ip < s->start)
374                         p = &(*p)->rb_left;
375                 else
376                         p = &(*p)->rb_right;
377         }
378         rb_link_node(&sym->rb_node, parent, p);
379         rb_insert_color(&sym->rb_node, symbols);
380 }
381
382 static struct symbol *symbols__find(struct rb_root *symbols, u64 ip)
383 {
384         struct rb_node *n;
385
386         if (symbols == NULL)
387                 return NULL;
388
389         n = symbols->rb_node;
390
391         while (n) {
392                 struct symbol *s = rb_entry(n, struct symbol, rb_node);
393
394                 if (ip < s->start)
395                         n = n->rb_left;
396                 else if (ip > s->end)
397                         n = n->rb_right;
398                 else
399                         return s;
400         }
401
402         return NULL;
403 }
404
405 struct symbol_name_rb_node {
406         struct rb_node  rb_node;
407         struct symbol   sym;
408 };
409
410 static void symbols__insert_by_name(struct rb_root *symbols, struct symbol *sym)
411 {
412         struct rb_node **p = &symbols->rb_node;
413         struct rb_node *parent = NULL;
414         struct symbol_name_rb_node *symn, *s;
415
416         symn = container_of(sym, struct symbol_name_rb_node, sym);
417
418         while (*p != NULL) {
419                 parent = *p;
420                 s = rb_entry(parent, struct symbol_name_rb_node, rb_node);
421                 if (strcmp(sym->name, s->sym.name) < 0)
422                         p = &(*p)->rb_left;
423                 else
424                         p = &(*p)->rb_right;
425         }
426         rb_link_node(&symn->rb_node, parent, p);
427         rb_insert_color(&symn->rb_node, symbols);
428 }
429
430 static void symbols__sort_by_name(struct rb_root *symbols,
431                                   struct rb_root *source)
432 {
433         struct rb_node *nd;
434
435         for (nd = rb_first(source); nd; nd = rb_next(nd)) {
436                 struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
437                 symbols__insert_by_name(symbols, pos);
438         }
439 }
440
441 static struct symbol *symbols__find_by_name(struct rb_root *symbols,
442                                             const char *name)
443 {
444         struct rb_node *n;
445
446         if (symbols == NULL)
447                 return NULL;
448
449         n = symbols->rb_node;
450
451         while (n) {
452                 struct symbol_name_rb_node *s;
453                 int cmp;
454
455                 s = rb_entry(n, struct symbol_name_rb_node, rb_node);
456                 cmp = strcmp(name, s->sym.name);
457
458                 if (cmp < 0)
459                         n = n->rb_left;
460                 else if (cmp > 0)
461                         n = n->rb_right;
462                 else
463                         return &s->sym;
464         }
465
466         return NULL;
467 }
468
469 struct symbol *dso__find_symbol(struct dso *dso,
470                                 enum map_type type, u64 addr)
471 {
472         return symbols__find(&dso->symbols[type], addr);
473 }
474
475 struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type,
476                                         const char *name)
477 {
478         return symbols__find_by_name(&dso->symbol_names[type], name);
479 }
480
481 void dso__sort_by_name(struct dso *dso, enum map_type type)
482 {
483         dso__set_sorted_by_name(dso, type);
484         return symbols__sort_by_name(&dso->symbol_names[type],
485                                      &dso->symbols[type]);
486 }
487
488 int build_id__sprintf(const u8 *build_id, int len, char *bf)
489 {
490         char *bid = bf;
491         const u8 *raw = build_id;
492         int i;
493
494         for (i = 0; i < len; ++i) {
495                 sprintf(bid, "%02x", *raw);
496                 ++raw;
497                 bid += 2;
498         }
499
500         return raw - build_id;
501 }
502
503 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp)
504 {
505         char sbuild_id[BUILD_ID_SIZE * 2 + 1];
506
507         build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
508         return fprintf(fp, "%s", sbuild_id);
509 }
510
511 size_t dso__fprintf_symbols_by_name(struct dso *dso,
512                                     enum map_type type, FILE *fp)
513 {
514         size_t ret = 0;
515         struct rb_node *nd;
516         struct symbol_name_rb_node *pos;
517
518         for (nd = rb_first(&dso->symbol_names[type]); nd; nd = rb_next(nd)) {
519                 pos = rb_entry(nd, struct symbol_name_rb_node, rb_node);
520                 fprintf(fp, "%s\n", pos->sym.name);
521         }
522
523         return ret;
524 }
525
526 size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp)
527 {
528         struct rb_node *nd;
529         size_t ret = fprintf(fp, "dso: %s (", dso->short_name);
530
531         if (dso->short_name != dso->long_name)
532                 ret += fprintf(fp, "%s, ", dso->long_name);
533         ret += fprintf(fp, "%s, %sloaded, ", map_type__name[type],
534                        dso->loaded ? "" : "NOT ");
535         ret += dso__fprintf_buildid(dso, fp);
536         ret += fprintf(fp, ")\n");
537         for (nd = rb_first(&dso->symbols[type]); nd; nd = rb_next(nd)) {
538                 struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
539                 ret += symbol__fprintf(pos, fp);
540         }
541
542         return ret;
543 }
544
545 int kallsyms__parse(const char *filename, void *arg,
546                     int (*process_symbol)(void *arg, const char *name,
547                                           char type, u64 start, u64 end))
548 {
549         char *line = NULL;
550         size_t n;
551         int err = -1;
552         FILE *file = fopen(filename, "r");
553
554         if (file == NULL)
555                 goto out_failure;
556
557         err = 0;
558
559         while (!feof(file)) {
560                 u64 start;
561                 int line_len, len;
562                 char symbol_type;
563                 char *symbol_name;
564
565                 line_len = getline(&line, &n, file);
566                 if (line_len < 0 || !line)
567                         break;
568
569                 line[--line_len] = '\0'; /* \n */
570
571                 len = hex2u64(line, &start);
572
573                 len++;
574                 if (len + 2 >= line_len)
575                         continue;
576
577                 symbol_type = line[len];
578                 len += 2;
579                 symbol_name = line + len;
580                 len = line_len - len;
581
582                 if (len >= KSYM_NAME_LEN) {
583                         err = -1;
584                         break;
585                 }
586
587                 /*
588                  * module symbols are not sorted so we add all
589                  * symbols with zero length and rely on
590                  * symbols__fixup_end() to fix it up.
591                  */
592                 err = process_symbol(arg, symbol_name,
593                                      symbol_type, start, start);
594                 if (err)
595                         break;
596         }
597
598         free(line);
599         fclose(file);
600         return err;
601
602 out_failure:
603         return -1;
604 }
605
606 struct process_kallsyms_args {
607         struct map *map;
608         struct dso *dso;
609 };
610
611 static u8 kallsyms2elf_type(char type)
612 {
613         if (type == 'W')
614                 return STB_WEAK;
615
616         return isupper(type) ? STB_GLOBAL : STB_LOCAL;
617 }
618
619 static int map__process_kallsym_symbol(void *arg, const char *name,
620                                        char type, u64 start, u64 end)
621 {
622         struct symbol *sym;
623         struct process_kallsyms_args *a = arg;
624         struct rb_root *root = &a->dso->symbols[a->map->type];
625
626         if (!symbol_type__is_a(type, a->map->type))
627                 return 0;
628
629         sym = symbol__new(start, end - start + 1,
630                           kallsyms2elf_type(type), name);
631         if (sym == NULL)
632                 return -ENOMEM;
633         /*
634          * We will pass the symbols to the filter later, in
635          * map__split_kallsyms, when we have split the maps per module
636          */
637         symbols__insert(root, sym);
638
639         return 0;
640 }
641
642 /*
643  * Loads the function entries in /proc/kallsyms into kernel_map->dso,
644  * so that we can in the next step set the symbol ->end address and then
645  * call kernel_maps__split_kallsyms.
646  */
647 static int dso__load_all_kallsyms(struct dso *dso, const char *filename,
648                                   struct map *map)
649 {
650         struct process_kallsyms_args args = { .map = map, .dso = dso, };
651         return kallsyms__parse(filename, &args, map__process_kallsym_symbol);
652 }
653
654 /*
655  * Split the symbols into maps, making sure there are no overlaps, i.e. the
656  * kernel range is broken in several maps, named [kernel].N, as we don't have
657  * the original ELF section names vmlinux have.
658  */
659 static int dso__split_kallsyms(struct dso *dso, struct map *map,
660                                symbol_filter_t filter)
661 {
662         struct map_groups *kmaps = map__kmap(map)->kmaps;
663         struct machine *machine = kmaps->machine;
664         struct map *curr_map = map;
665         struct symbol *pos;
666         int count = 0, moved = 0;       
667         struct rb_root *root = &dso->symbols[map->type];
668         struct rb_node *next = rb_first(root);
669         int kernel_range = 0;
670
671         while (next) {
672                 char *module;
673
674                 pos = rb_entry(next, struct symbol, rb_node);
675                 next = rb_next(&pos->rb_node);
676
677                 module = strchr(pos->name, '\t');
678                 if (module) {
679                         if (!symbol_conf.use_modules)
680                                 goto discard_symbol;
681
682                         *module++ = '\0';
683
684                         if (strcmp(curr_map->dso->short_name, module)) {
685                                 if (curr_map != map &&
686                                     dso->kernel == DSO_TYPE_GUEST_KERNEL &&
687                                     machine__is_default_guest(machine)) {
688                                         /*
689                                          * We assume all symbols of a module are
690                                          * continuous in * kallsyms, so curr_map
691                                          * points to a module and all its
692                                          * symbols are in its kmap. Mark it as
693                                          * loaded.
694                                          */
695                                         dso__set_loaded(curr_map->dso,
696                                                         curr_map->type);
697                                 }
698
699                                 curr_map = map_groups__find_by_name(kmaps,
700                                                         map->type, module);
701                                 if (curr_map == NULL) {
702                                         pr_debug("%s/proc/{kallsyms,modules} "
703                                                  "inconsistency while looking "
704                                                  "for \"%s\" module!\n",
705                                                  machine->root_dir, module);
706                                         curr_map = map;
707                                         goto discard_symbol;
708                                 }
709
710                                 if (curr_map->dso->loaded &&
711                                     !machine__is_default_guest(machine))
712                                         goto discard_symbol;
713                         }
714                         /*
715                          * So that we look just like we get from .ko files,
716                          * i.e. not prelinked, relative to map->start.
717                          */
718                         pos->start = curr_map->map_ip(curr_map, pos->start);
719                         pos->end   = curr_map->map_ip(curr_map, pos->end);
720                 } else if (curr_map != map) {
721                         char dso_name[PATH_MAX];
722                         struct dso *ndso;
723
724                         if (count == 0) {
725                                 curr_map = map;
726                                 goto filter_symbol;
727                         }
728
729                         if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
730                                 snprintf(dso_name, sizeof(dso_name),
731                                         "[guest.kernel].%d",
732                                         kernel_range++);
733                         else
734                                 snprintf(dso_name, sizeof(dso_name),
735                                         "[kernel].%d",
736                                         kernel_range++);
737
738                         ndso = dso__new(dso_name);
739                         if (ndso == NULL)
740                                 return -1;
741
742                         ndso->kernel = dso->kernel;
743
744                         curr_map = map__new2(pos->start, ndso, map->type);
745                         if (curr_map == NULL) {
746                                 dso__delete(ndso);
747                                 return -1;
748                         }
749
750                         curr_map->map_ip = curr_map->unmap_ip = identity__map_ip;
751                         map_groups__insert(kmaps, curr_map);
752                         ++kernel_range;
753                 }
754 filter_symbol:
755                 if (filter && filter(curr_map, pos)) {
756 discard_symbol:         rb_erase(&pos->rb_node, root);
757                         symbol__delete(pos);
758                 } else {
759                         if (curr_map != map) {
760                                 rb_erase(&pos->rb_node, root);
761                                 symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
762                                 ++moved;
763                         } else
764                                 ++count;
765                 }
766         }
767
768         if (curr_map != map &&
769             dso->kernel == DSO_TYPE_GUEST_KERNEL &&
770             machine__is_default_guest(kmaps->machine)) {
771                 dso__set_loaded(curr_map->dso, curr_map->type);
772         }
773
774         return count + moved;
775 }
776
777 static bool symbol__restricted_filename(const char *filename,
778                                         const char *restricted_filename)
779 {
780         bool restricted = false;
781
782         if (symbol_conf.kptr_restrict) {
783                 char *r = realpath(filename, NULL);
784
785                 if (r != NULL) {
786                         restricted = strcmp(r, restricted_filename) == 0;
787                         free(r);
788                         return restricted;
789                 }
790         }
791
792         return restricted;
793 }
794
795 int dso__load_kallsyms(struct dso *dso, const char *filename,
796                        struct map *map, symbol_filter_t filter)
797 {
798         if (symbol__restricted_filename(filename, "/proc/kallsyms"))
799                 return -1;
800
801         if (dso__load_all_kallsyms(dso, filename, map) < 0)
802                 return -1;
803
804         symbols__fixup_duplicate(&dso->symbols[map->type]);
805         symbols__fixup_end(&dso->symbols[map->type]);
806
807         if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
808                 dso->symtab_type = SYMTAB__GUEST_KALLSYMS;
809         else
810                 dso->symtab_type = SYMTAB__KALLSYMS;
811
812         return dso__split_kallsyms(dso, map, filter);
813 }
814
815 static int dso__load_perf_map(struct dso *dso, struct map *map,
816                               symbol_filter_t filter)
817 {
818         char *line = NULL;
819         size_t n;
820         FILE *file;
821         int nr_syms = 0;
822
823         file = fopen(dso->long_name, "r");
824         if (file == NULL)
825                 goto out_failure;
826
827         while (!feof(file)) {
828                 u64 start, size;
829                 struct symbol *sym;
830                 int line_len, len;
831
832                 line_len = getline(&line, &n, file);
833                 if (line_len < 0)
834                         break;
835
836                 if (!line)
837                         goto out_failure;
838
839                 line[--line_len] = '\0'; /* \n */
840
841                 len = hex2u64(line, &start);
842
843                 len++;
844                 if (len + 2 >= line_len)
845                         continue;
846
847                 len += hex2u64(line + len, &size);
848
849                 len++;
850                 if (len + 2 >= line_len)
851                         continue;
852
853                 sym = symbol__new(start, size, STB_GLOBAL, line + len);
854
855                 if (sym == NULL)
856                         goto out_delete_line;
857
858                 if (filter && filter(map, sym))
859                         symbol__delete(sym);
860                 else {
861                         symbols__insert(&dso->symbols[map->type], sym);
862                         nr_syms++;
863                 }
864         }
865
866         free(line);
867         fclose(file);
868
869         return nr_syms;
870
871 out_delete_line:
872         free(line);
873 out_failure:
874         return -1;
875 }
876
877 /**
878  * elf_symtab__for_each_symbol - iterate thru all the symbols
879  *
880  * @syms: struct elf_symtab instance to iterate
881  * @idx: uint32_t idx
882  * @sym: GElf_Sym iterator
883  */
884 #define elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) \
885         for (idx = 0, gelf_getsym(syms, idx, &sym);\
886              idx < nr_syms; \
887              idx++, gelf_getsym(syms, idx, &sym))
888
889 static inline uint8_t elf_sym__type(const GElf_Sym *sym)
890 {
891         return GELF_ST_TYPE(sym->st_info);
892 }
893
894 static inline int elf_sym__is_function(const GElf_Sym *sym)
895 {
896         return elf_sym__type(sym) == STT_FUNC &&
897                sym->st_name != 0 &&
898                sym->st_shndx != SHN_UNDEF;
899 }
900
901 static inline bool elf_sym__is_object(const GElf_Sym *sym)
902 {
903         return elf_sym__type(sym) == STT_OBJECT &&
904                 sym->st_name != 0 &&
905                 sym->st_shndx != SHN_UNDEF;
906 }
907
908 static inline int elf_sym__is_label(const GElf_Sym *sym)
909 {
910         return elf_sym__type(sym) == STT_NOTYPE &&
911                 sym->st_name != 0 &&
912                 sym->st_shndx != SHN_UNDEF &&
913                 sym->st_shndx != SHN_ABS;
914 }
915
916 static inline const char *elf_sec__name(const GElf_Shdr *shdr,
917                                         const Elf_Data *secstrs)
918 {
919         return secstrs->d_buf + shdr->sh_name;
920 }
921
922 static inline int elf_sec__is_text(const GElf_Shdr *shdr,
923                                         const Elf_Data *secstrs)
924 {
925         return strstr(elf_sec__name(shdr, secstrs), "text") != NULL;
926 }
927
928 static inline bool elf_sec__is_data(const GElf_Shdr *shdr,
929                                     const Elf_Data *secstrs)
930 {
931         return strstr(elf_sec__name(shdr, secstrs), "data") != NULL;
932 }
933
934 static inline const char *elf_sym__name(const GElf_Sym *sym,
935                                         const Elf_Data *symstrs)
936 {
937         return symstrs->d_buf + sym->st_name;
938 }
939
940 static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
941                                     GElf_Shdr *shp, const char *name,
942                                     size_t *idx)
943 {
944         Elf_Scn *sec = NULL;
945         size_t cnt = 1;
946
947         while ((sec = elf_nextscn(elf, sec)) != NULL) {
948                 char *str;
949
950                 gelf_getshdr(sec, shp);
951                 str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name);
952                 if (!strcmp(name, str)) {
953                         if (idx)
954                                 *idx = cnt;
955                         break;
956                 }
957                 ++cnt;
958         }
959
960         return sec;
961 }
962
963 #define elf_section__for_each_rel(reldata, pos, pos_mem, idx, nr_entries) \
964         for (idx = 0, pos = gelf_getrel(reldata, 0, &pos_mem); \
965              idx < nr_entries; \
966              ++idx, pos = gelf_getrel(reldata, idx, &pos_mem))
967
968 #define elf_section__for_each_rela(reldata, pos, pos_mem, idx, nr_entries) \
969         for (idx = 0, pos = gelf_getrela(reldata, 0, &pos_mem); \
970              idx < nr_entries; \
971              ++idx, pos = gelf_getrela(reldata, idx, &pos_mem))
972
973 /*
974  * We need to check if we have a .dynsym, so that we can handle the
975  * .plt, synthesizing its symbols, that aren't on the symtabs (be it
976  * .dynsym or .symtab).
977  * And always look at the original dso, not at debuginfo packages, that
978  * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
979  */
980 static int dso__synthesize_plt_symbols(struct  dso *dso, struct map *map,
981                                        symbol_filter_t filter)
982 {
983         uint32_t nr_rel_entries, idx;
984         GElf_Sym sym;
985         u64 plt_offset;
986         GElf_Shdr shdr_plt;
987         struct symbol *f;
988         GElf_Shdr shdr_rel_plt, shdr_dynsym;
989         Elf_Data *reldata, *syms, *symstrs;
990         Elf_Scn *scn_plt_rel, *scn_symstrs, *scn_dynsym;
991         size_t dynsym_idx;
992         GElf_Ehdr ehdr;
993         char sympltname[1024];
994         Elf *elf;
995         int nr = 0, symidx, fd, err = 0;
996         char name[PATH_MAX];
997
998         snprintf(name, sizeof(name), "%s%s",
999                  symbol_conf.symfs, dso->long_name);
1000         fd = open(name, O_RDONLY);
1001         if (fd < 0)
1002                 goto out;
1003
1004         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
1005         if (elf == NULL)
1006                 goto out_close;
1007
1008         if (gelf_getehdr(elf, &ehdr) == NULL)
1009                 goto out_elf_end;
1010
1011         scn_dynsym = elf_section_by_name(elf, &ehdr, &shdr_dynsym,
1012                                          ".dynsym", &dynsym_idx);
1013         if (scn_dynsym == NULL)
1014                 goto out_elf_end;
1015
1016         scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
1017                                           ".rela.plt", NULL);
1018         if (scn_plt_rel == NULL) {
1019                 scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
1020                                                   ".rel.plt", NULL);
1021                 if (scn_plt_rel == NULL)
1022                         goto out_elf_end;
1023         }
1024
1025         err = -1;
1026
1027         if (shdr_rel_plt.sh_link != dynsym_idx)
1028                 goto out_elf_end;
1029
1030         if (elf_section_by_name(elf, &ehdr, &shdr_plt, ".plt", NULL) == NULL)
1031                 goto out_elf_end;
1032
1033         /*
1034          * Fetch the relocation section to find the idxes to the GOT
1035          * and the symbols in the .dynsym they refer to.
1036          */
1037         reldata = elf_getdata(scn_plt_rel, NULL);
1038         if (reldata == NULL)
1039                 goto out_elf_end;
1040
1041         syms = elf_getdata(scn_dynsym, NULL);
1042         if (syms == NULL)
1043                 goto out_elf_end;
1044
1045         scn_symstrs = elf_getscn(elf, shdr_dynsym.sh_link);
1046         if (scn_symstrs == NULL)
1047                 goto out_elf_end;
1048
1049         symstrs = elf_getdata(scn_symstrs, NULL);
1050         if (symstrs == NULL)
1051                 goto out_elf_end;
1052
1053         nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize;
1054         plt_offset = shdr_plt.sh_offset;
1055
1056         if (shdr_rel_plt.sh_type == SHT_RELA) {
1057                 GElf_Rela pos_mem, *pos;
1058
1059                 elf_section__for_each_rela(reldata, pos, pos_mem, idx,
1060                                            nr_rel_entries) {
1061                         symidx = GELF_R_SYM(pos->r_info);
1062                         plt_offset += shdr_plt.sh_entsize;
1063                         gelf_getsym(syms, symidx, &sym);
1064                         snprintf(sympltname, sizeof(sympltname),
1065                                  "%s@plt", elf_sym__name(&sym, symstrs));
1066
1067                         f = symbol__new(plt_offset, shdr_plt.sh_entsize,
1068                                         STB_GLOBAL, sympltname);
1069                         if (!f)
1070                                 goto out_elf_end;
1071
1072                         if (filter && filter(map, f))
1073                                 symbol__delete(f);
1074                         else {
1075                                 symbols__insert(&dso->symbols[map->type], f);
1076                                 ++nr;
1077                         }
1078                 }
1079         } else if (shdr_rel_plt.sh_type == SHT_REL) {
1080                 GElf_Rel pos_mem, *pos;
1081                 elf_section__for_each_rel(reldata, pos, pos_mem, idx,
1082                                           nr_rel_entries) {
1083                         symidx = GELF_R_SYM(pos->r_info);
1084                         plt_offset += shdr_plt.sh_entsize;
1085                         gelf_getsym(syms, symidx, &sym);
1086                         snprintf(sympltname, sizeof(sympltname),
1087                                  "%s@plt", elf_sym__name(&sym, symstrs));
1088
1089                         f = symbol__new(plt_offset, shdr_plt.sh_entsize,
1090                                         STB_GLOBAL, sympltname);
1091                         if (!f)
1092                                 goto out_elf_end;
1093
1094                         if (filter && filter(map, f))
1095                                 symbol__delete(f);
1096                         else {
1097                                 symbols__insert(&dso->symbols[map->type], f);
1098                                 ++nr;
1099                         }
1100                 }
1101         }
1102
1103         err = 0;
1104 out_elf_end:
1105         elf_end(elf);
1106 out_close:
1107         close(fd);
1108
1109         if (err == 0)
1110                 return nr;
1111 out:
1112         pr_debug("%s: problems reading %s PLT info.\n",
1113                  __func__, dso->long_name);
1114         return 0;
1115 }
1116
1117 static bool elf_sym__is_a(GElf_Sym *sym, enum map_type type)
1118 {
1119         switch (type) {
1120         case MAP__FUNCTION:
1121                 return elf_sym__is_function(sym);
1122         case MAP__VARIABLE:
1123                 return elf_sym__is_object(sym);
1124         default:
1125                 return false;
1126         }
1127 }
1128
1129 static bool elf_sec__is_a(GElf_Shdr *shdr, Elf_Data *secstrs,
1130                           enum map_type type)
1131 {
1132         switch (type) {
1133         case MAP__FUNCTION:
1134                 return elf_sec__is_text(shdr, secstrs);
1135         case MAP__VARIABLE:
1136                 return elf_sec__is_data(shdr, secstrs);
1137         default:
1138                 return false;
1139         }
1140 }
1141
1142 static size_t elf_addr_to_index(Elf *elf, GElf_Addr addr)
1143 {
1144         Elf_Scn *sec = NULL;
1145         GElf_Shdr shdr;
1146         size_t cnt = 1;
1147
1148         while ((sec = elf_nextscn(elf, sec)) != NULL) {
1149                 gelf_getshdr(sec, &shdr);
1150
1151                 if ((addr >= shdr.sh_addr) &&
1152                     (addr < (shdr.sh_addr + shdr.sh_size)))
1153                         return cnt;
1154
1155                 ++cnt;
1156         }
1157
1158         return -1;
1159 }
1160
1161 static int dso__load_sym(struct dso *dso, struct map *map, const char *name,
1162                          int fd, symbol_filter_t filter, int kmodule,
1163                          int want_symtab)
1164 {
1165         struct kmap *kmap = dso->kernel ? map__kmap(map) : NULL;
1166         struct map *curr_map = map;
1167         struct dso *curr_dso = dso;
1168         Elf_Data *symstrs, *secstrs;
1169         uint32_t nr_syms;
1170         int err = -1;
1171         uint32_t idx;
1172         GElf_Ehdr ehdr;
1173         GElf_Shdr shdr, opdshdr;
1174         Elf_Data *syms, *opddata = NULL;
1175         GElf_Sym sym;
1176         Elf_Scn *sec, *sec_strndx, *opdsec;
1177         Elf *elf;
1178         int nr = 0;
1179         size_t opdidx = 0;
1180
1181         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
1182         if (elf == NULL) {
1183                 pr_debug("%s: cannot read %s ELF file.\n", __func__, name);
1184                 goto out_close;
1185         }
1186
1187         if (gelf_getehdr(elf, &ehdr) == NULL) {
1188                 pr_debug("%s: cannot get elf header.\n", __func__);
1189                 goto out_elf_end;
1190         }
1191
1192         /* Always reject images with a mismatched build-id: */
1193         if (dso->has_build_id) {
1194                 u8 build_id[BUILD_ID_SIZE];
1195
1196                 if (elf_read_build_id(elf, build_id, BUILD_ID_SIZE) < 0)
1197                         goto out_elf_end;
1198
1199                 if (!dso__build_id_equal(dso, build_id))
1200                         goto out_elf_end;
1201         }
1202
1203         sec = elf_section_by_name(elf, &ehdr, &shdr, ".symtab", NULL);
1204         if (sec == NULL) {
1205                 if (want_symtab)
1206                         goto out_elf_end;
1207
1208                 sec = elf_section_by_name(elf, &ehdr, &shdr, ".dynsym", NULL);
1209                 if (sec == NULL)
1210                         goto out_elf_end;
1211         }
1212
1213         opdsec = elf_section_by_name(elf, &ehdr, &opdshdr, ".opd", &opdidx);
1214         if (opdshdr.sh_type != SHT_PROGBITS)
1215                 opdsec = NULL;
1216         if (opdsec)
1217                 opddata = elf_rawdata(opdsec, NULL);
1218
1219         syms = elf_getdata(sec, NULL);
1220         if (syms == NULL)
1221                 goto out_elf_end;
1222
1223         sec = elf_getscn(elf, shdr.sh_link);
1224         if (sec == NULL)
1225                 goto out_elf_end;
1226
1227         symstrs = elf_getdata(sec, NULL);
1228         if (symstrs == NULL)
1229                 goto out_elf_end;
1230
1231         sec_strndx = elf_getscn(elf, ehdr.e_shstrndx);
1232         if (sec_strndx == NULL)
1233                 goto out_elf_end;
1234
1235         secstrs = elf_getdata(sec_strndx, NULL);
1236         if (secstrs == NULL)
1237                 goto out_elf_end;
1238
1239         nr_syms = shdr.sh_size / shdr.sh_entsize;
1240
1241         memset(&sym, 0, sizeof(sym));
1242         if (dso->kernel == DSO_TYPE_USER) {
1243                 dso->adjust_symbols = (ehdr.e_type == ET_EXEC ||
1244                                 elf_section_by_name(elf, &ehdr, &shdr,
1245                                                      ".gnu.prelink_undo",
1246                                                      NULL) != NULL);
1247         } else {
1248                 dso->adjust_symbols = 0;
1249         }
1250         elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
1251                 struct symbol *f;
1252                 const char *elf_name = elf_sym__name(&sym, symstrs);
1253                 char *demangled = NULL;
1254                 int is_label = elf_sym__is_label(&sym);
1255                 const char *section_name;
1256
1257                 if (kmap && kmap->ref_reloc_sym && kmap->ref_reloc_sym->name &&
1258                     strcmp(elf_name, kmap->ref_reloc_sym->name) == 0)
1259                         kmap->ref_reloc_sym->unrelocated_addr = sym.st_value;
1260
1261                 if (!is_label && !elf_sym__is_a(&sym, map->type))
1262                         continue;
1263
1264                 /* Reject ARM ELF "mapping symbols": these aren't unique and
1265                  * don't identify functions, so will confuse the profile
1266                  * output: */
1267                 if (ehdr.e_machine == EM_ARM) {
1268                         if (!strcmp(elf_name, "$a") ||
1269                             !strcmp(elf_name, "$d") ||
1270                             !strcmp(elf_name, "$t"))
1271                                 continue;
1272                 }
1273
1274                 if (opdsec && sym.st_shndx == opdidx) {
1275                         u32 offset = sym.st_value - opdshdr.sh_addr;
1276                         u64 *opd = opddata->d_buf + offset;
1277                         sym.st_value = *opd;
1278                         sym.st_shndx = elf_addr_to_index(elf, sym.st_value);
1279                 }
1280
1281                 sec = elf_getscn(elf, sym.st_shndx);
1282                 if (!sec)
1283                         goto out_elf_end;
1284
1285                 gelf_getshdr(sec, &shdr);
1286
1287                 if (is_label && !elf_sec__is_a(&shdr, secstrs, map->type))
1288                         continue;
1289
1290                 section_name = elf_sec__name(&shdr, secstrs);
1291
1292                 /* On ARM, symbols for thumb functions have 1 added to
1293                  * the symbol address as a flag - remove it */
1294                 if ((ehdr.e_machine == EM_ARM) &&
1295                     (map->type == MAP__FUNCTION) &&
1296                     (sym.st_value & 1))
1297                         --sym.st_value;
1298
1299                 if (dso->kernel != DSO_TYPE_USER || kmodule) {
1300                         char dso_name[PATH_MAX];
1301
1302                         if (strcmp(section_name,
1303                                    (curr_dso->short_name +
1304                                     dso->short_name_len)) == 0)
1305                                 goto new_symbol;
1306
1307                         if (strcmp(section_name, ".text") == 0) {
1308                                 curr_map = map;
1309                                 curr_dso = dso;
1310                                 goto new_symbol;
1311                         }
1312
1313                         snprintf(dso_name, sizeof(dso_name),
1314                                  "%s%s", dso->short_name, section_name);
1315
1316                         curr_map = map_groups__find_by_name(kmap->kmaps, map->type, dso_name);
1317                         if (curr_map == NULL) {
1318                                 u64 start = sym.st_value;
1319
1320                                 if (kmodule)
1321                                         start += map->start + shdr.sh_offset;
1322
1323                                 curr_dso = dso__new(dso_name);
1324                                 if (curr_dso == NULL)
1325                                         goto out_elf_end;
1326                                 curr_dso->kernel = dso->kernel;
1327                                 curr_dso->long_name = dso->long_name;
1328                                 curr_dso->long_name_len = dso->long_name_len;
1329                                 curr_map = map__new2(start, curr_dso,
1330                                                      map->type);
1331                                 if (curr_map == NULL) {
1332                                         dso__delete(curr_dso);
1333                                         goto out_elf_end;
1334                                 }
1335                                 curr_map->map_ip = identity__map_ip;
1336                                 curr_map->unmap_ip = identity__map_ip;
1337                                 curr_dso->symtab_type = dso->symtab_type;
1338                                 map_groups__insert(kmap->kmaps, curr_map);
1339                                 dsos__add(&dso->node, curr_dso);
1340                                 dso__set_loaded(curr_dso, map->type);
1341                         } else
1342                                 curr_dso = curr_map->dso;
1343
1344                         goto new_symbol;
1345                 }
1346
1347                 if (curr_dso->adjust_symbols) {
1348                         pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " "
1349                                   "sh_addr: %#" PRIx64 " sh_offset: %#" PRIx64 "\n", __func__,
1350                                   (u64)sym.st_value, (u64)shdr.sh_addr,
1351                                   (u64)shdr.sh_offset);
1352                         sym.st_value -= shdr.sh_addr - shdr.sh_offset;
1353                 }
1354                 /*
1355                  * We need to figure out if the object was created from C++ sources
1356                  * DWARF DW_compile_unit has this, but we don't always have access
1357                  * to it...
1358                  */
1359                 demangled = bfd_demangle(NULL, elf_name, DMGL_PARAMS | DMGL_ANSI);
1360                 if (demangled != NULL)
1361                         elf_name = demangled;
1362 new_symbol:
1363                 f = symbol__new(sym.st_value, sym.st_size,
1364                                 GELF_ST_BIND(sym.st_info), elf_name);
1365                 free(demangled);
1366                 if (!f)
1367                         goto out_elf_end;
1368
1369                 if (filter && filter(curr_map, f))
1370                         symbol__delete(f);
1371                 else {
1372                         symbols__insert(&curr_dso->symbols[curr_map->type], f);
1373                         nr++;
1374                 }
1375         }
1376
1377         /*
1378          * For misannotated, zeroed, ASM function sizes.
1379          */
1380         if (nr > 0) {
1381                 symbols__fixup_duplicate(&dso->symbols[map->type]);
1382                 symbols__fixup_end(&dso->symbols[map->type]);
1383                 if (kmap) {
1384                         /*
1385                          * We need to fixup this here too because we create new
1386                          * maps here, for things like vsyscall sections.
1387                          */
1388                         __map_groups__fixup_end(kmap->kmaps, map->type);
1389                 }
1390         }
1391         err = nr;
1392 out_elf_end:
1393         elf_end(elf);
1394 out_close:
1395         return err;
1396 }
1397
1398 static bool dso__build_id_equal(const struct dso *dso, u8 *build_id)
1399 {
1400         return memcmp(dso->build_id, build_id, sizeof(dso->build_id)) == 0;
1401 }
1402
1403 bool __dsos__read_build_ids(struct list_head *head, bool with_hits)
1404 {
1405         bool have_build_id = false;
1406         struct dso *pos;
1407
1408         list_for_each_entry(pos, head, node) {
1409                 if (with_hits && !pos->hit)
1410                         continue;
1411                 if (pos->has_build_id) {
1412                         have_build_id = true;
1413                         continue;
1414                 }
1415                 if (filename__read_build_id(pos->long_name, pos->build_id,
1416                                             sizeof(pos->build_id)) > 0) {
1417                         have_build_id     = true;
1418                         pos->has_build_id = true;
1419                 }
1420         }
1421
1422         return have_build_id;
1423 }
1424
1425 /*
1426  * Align offset to 4 bytes as needed for note name and descriptor data.
1427  */
1428 #define NOTE_ALIGN(n) (((n) + 3) & -4U)
1429
1430 static int elf_read_build_id(Elf *elf, void *bf, size_t size)
1431 {
1432         int err = -1;
1433         GElf_Ehdr ehdr;
1434         GElf_Shdr shdr;
1435         Elf_Data *data;
1436         Elf_Scn *sec;
1437         Elf_Kind ek;
1438         void *ptr;
1439
1440         if (size < BUILD_ID_SIZE)
1441                 goto out;
1442
1443         ek = elf_kind(elf);
1444         if (ek != ELF_K_ELF)
1445                 goto out;
1446
1447         if (gelf_getehdr(elf, &ehdr) == NULL) {
1448                 pr_err("%s: cannot get elf header.\n", __func__);
1449                 goto out;
1450         }
1451
1452         sec = elf_section_by_name(elf, &ehdr, &shdr,
1453                                   ".note.gnu.build-id", NULL);
1454         if (sec == NULL) {
1455                 sec = elf_section_by_name(elf, &ehdr, &shdr,
1456                                           ".notes", NULL);
1457                 if (sec == NULL)
1458                         goto out;
1459         }
1460
1461         data = elf_getdata(sec, NULL);
1462         if (data == NULL)
1463                 goto out;
1464
1465         ptr = data->d_buf;
1466         while (ptr < (data->d_buf + data->d_size)) {
1467                 GElf_Nhdr *nhdr = ptr;
1468                 size_t namesz = NOTE_ALIGN(nhdr->n_namesz),
1469                        descsz = NOTE_ALIGN(nhdr->n_descsz);
1470                 const char *name;
1471
1472                 ptr += sizeof(*nhdr);
1473                 name = ptr;
1474                 ptr += namesz;
1475                 if (nhdr->n_type == NT_GNU_BUILD_ID &&
1476                     nhdr->n_namesz == sizeof("GNU")) {
1477                         if (memcmp(name, "GNU", sizeof("GNU")) == 0) {
1478                                 size_t sz = min(size, descsz);
1479                                 memcpy(bf, ptr, sz);
1480                                 memset(bf + sz, 0, size - sz);
1481                                 err = descsz;
1482                                 break;
1483                         }
1484                 }
1485                 ptr += descsz;
1486         }
1487
1488 out:
1489         return err;
1490 }
1491
1492 int filename__read_build_id(const char *filename, void *bf, size_t size)
1493 {
1494         int fd, err = -1;
1495         Elf *elf;
1496
1497         if (size < BUILD_ID_SIZE)
1498                 goto out;
1499
1500         fd = open(filename, O_RDONLY);
1501         if (fd < 0)
1502                 goto out;
1503
1504         elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
1505         if (elf == NULL) {
1506                 pr_debug2("%s: cannot read %s ELF file.\n", __func__, filename);
1507                 goto out_close;
1508         }
1509
1510         err = elf_read_build_id(elf, bf, size);
1511
1512         elf_end(elf);
1513 out_close:
1514         close(fd);
1515 out:
1516         return err;
1517 }
1518
1519 int sysfs__read_build_id(const char *filename, void *build_id, size_t size)
1520 {
1521         int fd, err = -1;
1522
1523         if (size < BUILD_ID_SIZE)
1524                 goto out;
1525
1526         fd = open(filename, O_RDONLY);
1527         if (fd < 0)
1528                 goto out;
1529
1530         while (1) {
1531                 char bf[BUFSIZ];
1532                 GElf_Nhdr nhdr;
1533                 size_t namesz, descsz;
1534
1535                 if (read(fd, &nhdr, sizeof(nhdr)) != sizeof(nhdr))
1536                         break;
1537
1538                 namesz = NOTE_ALIGN(nhdr.n_namesz);
1539                 descsz = NOTE_ALIGN(nhdr.n_descsz);
1540                 if (nhdr.n_type == NT_GNU_BUILD_ID &&
1541                     nhdr.n_namesz == sizeof("GNU")) {
1542                         if (read(fd, bf, namesz) != (ssize_t)namesz)
1543                                 break;
1544                         if (memcmp(bf, "GNU", sizeof("GNU")) == 0) {
1545                                 size_t sz = min(descsz, size);
1546                                 if (read(fd, build_id, sz) == (ssize_t)sz) {
1547                                         memset(build_id + sz, 0, size - sz);
1548                                         err = 0;
1549                                         break;
1550                                 }
1551                         } else if (read(fd, bf, descsz) != (ssize_t)descsz)
1552                                 break;
1553                 } else {
1554                         int n = namesz + descsz;
1555                         if (read(fd, bf, n) != n)
1556                                 break;
1557                 }
1558         }
1559         close(fd);
1560 out:
1561         return err;
1562 }
1563
1564 char dso__symtab_origin(const struct dso *dso)
1565 {
1566         static const char origin[] = {
1567                 [SYMTAB__KALLSYMS]            = 'k',
1568                 [SYMTAB__JAVA_JIT]            = 'j',
1569                 [SYMTAB__BUILD_ID_CACHE]      = 'B',
1570                 [SYMTAB__FEDORA_DEBUGINFO]    = 'f',
1571                 [SYMTAB__UBUNTU_DEBUGINFO]    = 'u',
1572                 [SYMTAB__BUILDID_DEBUGINFO]   = 'b',
1573                 [SYMTAB__SYSTEM_PATH_DSO]     = 'd',
1574                 [SYMTAB__SYSTEM_PATH_KMODULE] = 'K',
1575                 [SYMTAB__GUEST_KALLSYMS]      =  'g',
1576                 [SYMTAB__GUEST_KMODULE]       =  'G',
1577         };
1578
1579         if (dso == NULL || dso->symtab_type == SYMTAB__NOT_FOUND)
1580                 return '!';
1581         return origin[dso->symtab_type];
1582 }
1583
1584 int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
1585 {
1586         int size = PATH_MAX;
1587         char *name;
1588         int ret = -1;
1589         int fd;
1590         struct machine *machine;
1591         const char *root_dir;
1592         int want_symtab;
1593
1594         dso__set_loaded(dso, map->type);
1595
1596         if (dso->kernel == DSO_TYPE_KERNEL)
1597                 return dso__load_kernel_sym(dso, map, filter);
1598         else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1599                 return dso__load_guest_kernel_sym(dso, map, filter);
1600
1601         if (map->groups && map->groups->machine)
1602                 machine = map->groups->machine;
1603         else
1604                 machine = NULL;
1605
1606         name = malloc(size);
1607         if (!name)
1608                 return -1;
1609
1610         dso->adjust_symbols = 0;
1611
1612         if (strncmp(dso->name, "/tmp/perf-", 10) == 0) {
1613                 struct stat st;
1614
1615                 if (lstat(dso->name, &st) < 0)
1616                         return -1;
1617
1618                 if (st.st_uid && (st.st_uid != geteuid())) {
1619                         pr_warning("File %s not owned by current user or root, "
1620                                 "ignoring it.\n", dso->name);
1621                         return -1;
1622                 }
1623
1624                 ret = dso__load_perf_map(dso, map, filter);
1625                 dso->symtab_type = ret > 0 ? SYMTAB__JAVA_JIT :
1626                                               SYMTAB__NOT_FOUND;
1627                 return ret;
1628         }
1629
1630         /* Iterate over candidate debug images.
1631          * On the first pass, only load images if they have a full symtab.
1632          * Failing that, do a second pass where we accept .dynsym also
1633          */
1634         want_symtab = 1;
1635 restart:
1636         for (dso->symtab_type = SYMTAB__BUILD_ID_CACHE;
1637              dso->symtab_type != SYMTAB__NOT_FOUND;
1638              dso->symtab_type++) {
1639                 switch (dso->symtab_type) {
1640                 case SYMTAB__BUILD_ID_CACHE:
1641                         /* skip the locally configured cache if a symfs is given */
1642                         if (symbol_conf.symfs[0] ||
1643                             (dso__build_id_filename(dso, name, size) == NULL)) {
1644                                 continue;
1645                         }
1646                         break;
1647                 case SYMTAB__FEDORA_DEBUGINFO:
1648                         snprintf(name, size, "%s/usr/lib/debug%s.debug",
1649                                  symbol_conf.symfs, dso->long_name);
1650                         break;
1651                 case SYMTAB__UBUNTU_DEBUGINFO:
1652                         snprintf(name, size, "%s/usr/lib/debug%s",
1653                                  symbol_conf.symfs, dso->long_name);
1654                         break;
1655                 case SYMTAB__BUILDID_DEBUGINFO: {
1656                         char build_id_hex[BUILD_ID_SIZE * 2 + 1];
1657
1658                         if (!dso->has_build_id)
1659                                 continue;
1660
1661                         build_id__sprintf(dso->build_id,
1662                                           sizeof(dso->build_id),
1663                                           build_id_hex);
1664                         snprintf(name, size,
1665                                  "%s/usr/lib/debug/.build-id/%.2s/%s.debug",
1666                                  symbol_conf.symfs, build_id_hex, build_id_hex + 2);
1667                         }
1668                         break;
1669                 case SYMTAB__SYSTEM_PATH_DSO:
1670                         snprintf(name, size, "%s%s",
1671                              symbol_conf.symfs, dso->long_name);
1672                         break;
1673                 case SYMTAB__GUEST_KMODULE:
1674                         if (map->groups && machine)
1675                                 root_dir = machine->root_dir;
1676                         else
1677                                 root_dir = "";
1678                         snprintf(name, size, "%s%s%s", symbol_conf.symfs,
1679                                  root_dir, dso->long_name);
1680                         break;
1681
1682                 case SYMTAB__SYSTEM_PATH_KMODULE:
1683                         snprintf(name, size, "%s%s", symbol_conf.symfs,
1684                                  dso->long_name);
1685                         break;
1686                 default:;
1687                 }
1688
1689                 /* Name is now the name of the next image to try */
1690                 fd = open(name, O_RDONLY);
1691                 if (fd < 0)
1692                         continue;
1693
1694                 ret = dso__load_sym(dso, map, name, fd, filter, 0,
1695                                     want_symtab);
1696                 close(fd);
1697
1698                 /*
1699                  * Some people seem to have debuginfo files _WITHOUT_ debug
1700                  * info!?!?
1701                  */
1702                 if (!ret)
1703                         continue;
1704
1705                 if (ret > 0) {
1706                         int nr_plt = dso__synthesize_plt_symbols(dso, map,
1707                                                                  filter);
1708                         if (nr_plt > 0)
1709                                 ret += nr_plt;
1710                         break;
1711                 }
1712         }
1713
1714         /*
1715          * If we wanted a full symtab but no image had one,
1716          * relax our requirements and repeat the search.
1717          */
1718         if (ret <= 0 && want_symtab) {
1719                 want_symtab = 0;
1720                 goto restart;
1721         }
1722
1723         free(name);
1724         if (ret < 0 && strstr(dso->name, " (deleted)") != NULL)
1725                 return 0;
1726         return ret;
1727 }
1728
1729 struct map *map_groups__find_by_name(struct map_groups *mg,
1730                                      enum map_type type, const char *name)
1731 {
1732         struct rb_node *nd;
1733
1734         for (nd = rb_first(&mg->maps[type]); nd; nd = rb_next(nd)) {
1735                 struct map *map = rb_entry(nd, struct map, rb_node);
1736
1737                 if (map->dso && strcmp(map->dso->short_name, name) == 0)
1738                         return map;
1739         }
1740
1741         return NULL;
1742 }
1743
1744 static int dso__kernel_module_get_build_id(struct dso *dso,
1745                                            const char *root_dir)
1746 {
1747         char filename[PATH_MAX];
1748         /*
1749          * kernel module short names are of the form "[module]" and
1750          * we need just "module" here.
1751          */
1752         const char *name = dso->short_name + 1;
1753
1754         snprintf(filename, sizeof(filename),
1755                  "%s/sys/module/%.*s/notes/.note.gnu.build-id",
1756                  root_dir, (int)strlen(name) - 1, name);
1757
1758         if (sysfs__read_build_id(filename, dso->build_id,
1759                                  sizeof(dso->build_id)) == 0)
1760                 dso->has_build_id = true;
1761
1762         return 0;
1763 }
1764
1765 static int map_groups__set_modules_path_dir(struct map_groups *mg,
1766                                 const char *dir_name)
1767 {
1768         struct dirent *dent;
1769         DIR *dir = opendir(dir_name);
1770         int ret = 0;
1771
1772         if (!dir) {
1773                 pr_debug("%s: cannot open %s dir\n", __func__, dir_name);
1774                 return -1;
1775         }
1776
1777         while ((dent = readdir(dir)) != NULL) {
1778                 char path[PATH_MAX];
1779                 struct stat st;
1780
1781                 /*sshfs might return bad dent->d_type, so we have to stat*/
1782                 snprintf(path, sizeof(path), "%s/%s", dir_name, dent->d_name);
1783                 if (stat(path, &st))
1784                         continue;
1785
1786                 if (S_ISDIR(st.st_mode)) {
1787                         if (!strcmp(dent->d_name, ".") ||
1788                             !strcmp(dent->d_name, ".."))
1789                                 continue;
1790
1791                         ret = map_groups__set_modules_path_dir(mg, path);
1792                         if (ret < 0)
1793                                 goto out;
1794                 } else {
1795                         char *dot = strrchr(dent->d_name, '.'),
1796                              dso_name[PATH_MAX];
1797                         struct map *map;
1798                         char *long_name;
1799
1800                         if (dot == NULL || strcmp(dot, ".ko"))
1801                                 continue;
1802                         snprintf(dso_name, sizeof(dso_name), "[%.*s]",
1803                                  (int)(dot - dent->d_name), dent->d_name);
1804
1805                         strxfrchar(dso_name, '-', '_');
1806                         map = map_groups__find_by_name(mg, MAP__FUNCTION,
1807                                                        dso_name);
1808                         if (map == NULL)
1809                                 continue;
1810
1811                         long_name = strdup(path);
1812                         if (long_name == NULL) {
1813                                 ret = -1;
1814                                 goto out;
1815                         }
1816                         dso__set_long_name(map->dso, long_name);
1817                         map->dso->lname_alloc = 1;
1818                         dso__kernel_module_get_build_id(map->dso, "");
1819                 }
1820         }
1821
1822 out:
1823         closedir(dir);
1824         return ret;
1825 }
1826
1827 static char *get_kernel_version(const char *root_dir)
1828 {
1829         char version[PATH_MAX];
1830         FILE *file;
1831         char *name, *tmp;
1832         const char *prefix = "Linux version ";
1833
1834         sprintf(version, "%s/proc/version", root_dir);
1835         file = fopen(version, "r");
1836         if (!file)
1837                 return NULL;
1838
1839         version[0] = '\0';
1840         tmp = fgets(version, sizeof(version), file);
1841         fclose(file);
1842
1843         name = strstr(version, prefix);
1844         if (!name)
1845                 return NULL;
1846         name += strlen(prefix);
1847         tmp = strchr(name, ' ');
1848         if (tmp)
1849                 *tmp = '\0';
1850
1851         return strdup(name);
1852 }
1853
1854 static int machine__set_modules_path(struct machine *machine)
1855 {
1856         char *version;
1857         char modules_path[PATH_MAX];
1858
1859         version = get_kernel_version(machine->root_dir);
1860         if (!version)
1861                 return -1;
1862
1863         snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s/kernel",
1864                  machine->root_dir, version);
1865         free(version);
1866
1867         return map_groups__set_modules_path_dir(&machine->kmaps, modules_path);
1868 }
1869
1870 /*
1871  * Constructor variant for modules (where we know from /proc/modules where
1872  * they are loaded) and for vmlinux, where only after we load all the
1873  * symbols we'll know where it starts and ends.
1874  */
1875 static struct map *map__new2(u64 start, struct dso *dso, enum map_type type)
1876 {
1877         struct map *map = calloc(1, (sizeof(*map) +
1878                                      (dso->kernel ? sizeof(struct kmap) : 0)));
1879         if (map != NULL) {
1880                 /*
1881                  * ->end will be filled after we load all the symbols
1882                  */
1883                 map__init(map, type, start, 0, 0, dso);
1884         }
1885
1886         return map;
1887 }
1888
1889 struct map *machine__new_module(struct machine *machine, u64 start,
1890                                 const char *filename)
1891 {
1892         struct map *map;
1893         struct dso *dso = __dsos__findnew(&machine->kernel_dsos, filename);
1894
1895         if (dso == NULL)
1896                 return NULL;
1897
1898         map = map__new2(start, dso, MAP__FUNCTION);
1899         if (map == NULL)
1900                 return NULL;
1901
1902         if (machine__is_host(machine))
1903                 dso->symtab_type = SYMTAB__SYSTEM_PATH_KMODULE;
1904         else
1905                 dso->symtab_type = SYMTAB__GUEST_KMODULE;
1906         map_groups__insert(&machine->kmaps, map);
1907         return map;
1908 }
1909
1910 static int machine__create_modules(struct machine *machine)
1911 {
1912         char *line = NULL;
1913         size_t n;
1914         FILE *file;
1915         struct map *map;
1916         const char *modules;
1917         char path[PATH_MAX];
1918
1919         if (machine__is_default_guest(machine))
1920                 modules = symbol_conf.default_guest_modules;
1921         else {
1922                 sprintf(path, "%s/proc/modules", machine->root_dir);
1923                 modules = path;
1924         }
1925
1926         if (symbol__restricted_filename(path, "/proc/modules"))
1927                 return -1;
1928
1929         file = fopen(modules, "r");
1930         if (file == NULL)
1931                 return -1;
1932
1933         while (!feof(file)) {
1934                 char name[PATH_MAX];
1935                 u64 start;
1936                 char *sep;
1937                 int line_len;
1938
1939                 line_len = getline(&line, &n, file);
1940                 if (line_len < 0)
1941                         break;
1942
1943                 if (!line)
1944                         goto out_failure;
1945
1946                 line[--line_len] = '\0'; /* \n */
1947
1948                 sep = strrchr(line, 'x');
1949                 if (sep == NULL)
1950                         continue;
1951
1952                 hex2u64(sep + 1, &start);
1953
1954                 sep = strchr(line, ' ');
1955                 if (sep == NULL)
1956                         continue;
1957
1958                 *sep = '\0';
1959
1960                 snprintf(name, sizeof(name), "[%s]", line);
1961                 map = machine__new_module(machine, start, name);
1962                 if (map == NULL)
1963                         goto out_delete_line;
1964                 dso__kernel_module_get_build_id(map->dso, machine->root_dir);
1965         }
1966
1967         free(line);
1968         fclose(file);
1969
1970         return machine__set_modules_path(machine);
1971
1972 out_delete_line:
1973         free(line);
1974 out_failure:
1975         return -1;
1976 }
1977
1978 int dso__load_vmlinux(struct dso *dso, struct map *map,
1979                       const char *vmlinux, symbol_filter_t filter)
1980 {
1981         int err = -1, fd;
1982         char symfs_vmlinux[PATH_MAX];
1983
1984         snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s%s",
1985                  symbol_conf.symfs, vmlinux);
1986         fd = open(symfs_vmlinux, O_RDONLY);
1987         if (fd < 0)
1988                 return -1;
1989
1990         dso__set_long_name(dso, (char *)vmlinux);
1991         dso__set_loaded(dso, map->type);
1992         err = dso__load_sym(dso, map, symfs_vmlinux, fd, filter, 0, 0);
1993         close(fd);
1994
1995         if (err > 0)
1996                 pr_debug("Using %s for symbols\n", symfs_vmlinux);
1997
1998         return err;
1999 }
2000
2001 int dso__load_vmlinux_path(struct dso *dso, struct map *map,
2002                            symbol_filter_t filter)
2003 {
2004         int i, err = 0;
2005         char *filename;
2006
2007         pr_debug("Looking at the vmlinux_path (%d entries long)\n",
2008                  vmlinux_path__nr_entries + 1);
2009
2010         filename = dso__build_id_filename(dso, NULL, 0);
2011         if (filename != NULL) {
2012                 err = dso__load_vmlinux(dso, map, filename, filter);
2013                 if (err > 0) {
2014                         dso__set_long_name(dso, filename);
2015                         goto out;
2016                 }
2017                 free(filename);
2018         }
2019
2020         for (i = 0; i < vmlinux_path__nr_entries; ++i) {
2021                 err = dso__load_vmlinux(dso, map, vmlinux_path[i], filter);
2022                 if (err > 0) {
2023                         dso__set_long_name(dso, strdup(vmlinux_path[i]));
2024                         break;
2025                 }
2026         }
2027 out:
2028         return err;
2029 }
2030
2031 static int dso__load_kernel_sym(struct dso *dso, struct map *map,
2032                                 symbol_filter_t filter)
2033 {
2034         int err;
2035         const char *kallsyms_filename = NULL;
2036         char *kallsyms_allocated_filename = NULL;
2037         /*
2038          * Step 1: if the user specified a kallsyms or vmlinux filename, use
2039          * it and only it, reporting errors to the user if it cannot be used.
2040          *
2041          * For instance, try to analyse an ARM perf.data file _without_ a
2042          * build-id, or if the user specifies the wrong path to the right
2043          * vmlinux file, obviously we can't fallback to another vmlinux (a
2044          * x86_86 one, on the machine where analysis is being performed, say),
2045          * or worse, /proc/kallsyms.
2046          *
2047          * If the specified file _has_ a build-id and there is a build-id
2048          * section in the perf.data file, we will still do the expected
2049          * validation in dso__load_vmlinux and will bail out if they don't
2050          * match.
2051          */
2052         if (symbol_conf.kallsyms_name != NULL) {
2053                 kallsyms_filename = symbol_conf.kallsyms_name;
2054                 goto do_kallsyms;
2055         }
2056
2057         if (symbol_conf.vmlinux_name != NULL) {
2058                 err = dso__load_vmlinux(dso, map,
2059                                         symbol_conf.vmlinux_name, filter);
2060                 if (err > 0) {
2061                         dso__set_long_name(dso,
2062                                            strdup(symbol_conf.vmlinux_name));
2063                         goto out_fixup;
2064                 }
2065                 return err;
2066         }
2067
2068         if (vmlinux_path != NULL) {
2069                 err = dso__load_vmlinux_path(dso, map, filter);
2070                 if (err > 0)
2071                         goto out_fixup;
2072         }
2073
2074         /* do not try local files if a symfs was given */
2075         if (symbol_conf.symfs[0] != 0)
2076                 return -1;
2077
2078         /*
2079          * Say the kernel DSO was created when processing the build-id header table,
2080          * we have a build-id, so check if it is the same as the running kernel,
2081          * using it if it is.
2082          */
2083         if (dso->has_build_id) {
2084                 u8 kallsyms_build_id[BUILD_ID_SIZE];
2085                 char sbuild_id[BUILD_ID_SIZE * 2 + 1];
2086
2087                 if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id,
2088                                          sizeof(kallsyms_build_id)) == 0) {
2089                         if (dso__build_id_equal(dso, kallsyms_build_id)) {
2090                                 kallsyms_filename = "/proc/kallsyms";
2091                                 goto do_kallsyms;
2092                         }
2093                 }
2094                 /*
2095                  * Now look if we have it on the build-id cache in
2096                  * $HOME/.debug/[kernel.kallsyms].
2097                  */
2098                 build_id__sprintf(dso->build_id, sizeof(dso->build_id),
2099                                   sbuild_id);
2100
2101                 if (asprintf(&kallsyms_allocated_filename,
2102                              "%s/.debug/[kernel.kallsyms]/%s",
2103                              getenv("HOME"), sbuild_id) == -1) {
2104                         pr_err("Not enough memory for kallsyms file lookup\n");
2105                         return -1;
2106                 }
2107
2108                 kallsyms_filename = kallsyms_allocated_filename;
2109
2110                 if (access(kallsyms_filename, F_OK)) {
2111                         pr_err("No kallsyms or vmlinux with build-id %s "
2112                                "was found\n", sbuild_id);
2113                         free(kallsyms_allocated_filename);
2114                         return -1;
2115                 }
2116         } else {
2117                 /*
2118                  * Last resort, if we don't have a build-id and couldn't find
2119                  * any vmlinux file, try the running kernel kallsyms table.
2120                  */
2121                 kallsyms_filename = "/proc/kallsyms";
2122         }
2123
2124 do_kallsyms:
2125         err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
2126         if (err > 0)
2127                 pr_debug("Using %s for symbols\n", kallsyms_filename);
2128         free(kallsyms_allocated_filename);
2129
2130         if (err > 0) {
2131 out_fixup:
2132                 if (kallsyms_filename != NULL)
2133                         dso__set_long_name(dso, strdup("[kernel.kallsyms]"));
2134                 map__fixup_start(map);
2135                 map__fixup_end(map);
2136         }
2137
2138         return err;
2139 }
2140
2141 static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
2142                                       symbol_filter_t filter)
2143 {
2144         int err;
2145         const char *kallsyms_filename = NULL;
2146         struct machine *machine;
2147         char path[PATH_MAX];
2148
2149         if (!map->groups) {
2150                 pr_debug("Guest kernel map hasn't the point to groups\n");
2151                 return -1;
2152         }
2153         machine = map->groups->machine;
2154
2155         if (machine__is_default_guest(machine)) {
2156                 /*
2157                  * if the user specified a vmlinux filename, use it and only
2158                  * it, reporting errors to the user if it cannot be used.
2159                  * Or use file guest_kallsyms inputted by user on commandline
2160                  */
2161                 if (symbol_conf.default_guest_vmlinux_name != NULL) {
2162                         err = dso__load_vmlinux(dso, map,
2163                                 symbol_conf.default_guest_vmlinux_name, filter);
2164                         goto out_try_fixup;
2165                 }
2166
2167                 kallsyms_filename = symbol_conf.default_guest_kallsyms;
2168                 if (!kallsyms_filename)
2169                         return -1;
2170         } else {
2171                 sprintf(path, "%s/proc/kallsyms", machine->root_dir);
2172                 kallsyms_filename = path;
2173         }
2174
2175         err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
2176         if (err > 0)
2177                 pr_debug("Using %s for symbols\n", kallsyms_filename);
2178
2179 out_try_fixup:
2180         if (err > 0) {
2181                 if (kallsyms_filename != NULL) {
2182                         machine__mmap_name(machine, path, sizeof(path));
2183                         dso__set_long_name(dso, strdup(path));
2184                 }
2185                 map__fixup_start(map);
2186                 map__fixup_end(map);
2187         }
2188
2189         return err;
2190 }
2191
2192 static void dsos__add(struct list_head *head, struct dso *dso)
2193 {
2194         list_add_tail(&dso->node, head);
2195 }
2196
2197 static struct dso *dsos__find(struct list_head *head, const char *name)
2198 {
2199         struct dso *pos;
2200
2201         list_for_each_entry(pos, head, node)
2202                 if (strcmp(pos->long_name, name) == 0)
2203                         return pos;
2204         return NULL;
2205 }
2206
2207 struct dso *__dsos__findnew(struct list_head *head, const char *name)
2208 {
2209         struct dso *dso = dsos__find(head, name);
2210
2211         if (!dso) {
2212                 dso = dso__new(name);
2213                 if (dso != NULL) {
2214                         dsos__add(head, dso);
2215                         dso__set_basename(dso);
2216                 }
2217         }
2218
2219         return dso;
2220 }
2221
2222 size_t __dsos__fprintf(struct list_head *head, FILE *fp)
2223 {
2224         struct dso *pos;
2225         size_t ret = 0;
2226
2227         list_for_each_entry(pos, head, node) {
2228                 int i;
2229                 for (i = 0; i < MAP__NR_TYPES; ++i)
2230                         ret += dso__fprintf(pos, i, fp);
2231         }
2232
2233         return ret;
2234 }
2235
2236 size_t machines__fprintf_dsos(struct rb_root *machines, FILE *fp)
2237 {
2238         struct rb_node *nd;
2239         size_t ret = 0;
2240
2241         for (nd = rb_first(machines); nd; nd = rb_next(nd)) {
2242                 struct machine *pos = rb_entry(nd, struct machine, rb_node);
2243                 ret += __dsos__fprintf(&pos->kernel_dsos, fp);
2244                 ret += __dsos__fprintf(&pos->user_dsos, fp);
2245         }
2246
2247         return ret;
2248 }
2249
2250 static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
2251                                       bool with_hits)
2252 {
2253         struct dso *pos;
2254         size_t ret = 0;
2255
2256         list_for_each_entry(pos, head, node) {
2257                 if (with_hits && !pos->hit)
2258                         continue;
2259                 ret += dso__fprintf_buildid(pos, fp);
2260                 ret += fprintf(fp, " %s\n", pos->long_name);
2261         }
2262         return ret;
2263 }
2264
2265 size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp,
2266                                      bool with_hits)
2267 {
2268         return __dsos__fprintf_buildid(&machine->kernel_dsos, fp, with_hits) +
2269                __dsos__fprintf_buildid(&machine->user_dsos, fp, with_hits);
2270 }
2271
2272 size_t machines__fprintf_dsos_buildid(struct rb_root *machines,
2273                                       FILE *fp, bool with_hits)
2274 {
2275         struct rb_node *nd;
2276         size_t ret = 0;
2277
2278         for (nd = rb_first(machines); nd; nd = rb_next(nd)) {
2279                 struct machine *pos = rb_entry(nd, struct machine, rb_node);
2280                 ret += machine__fprintf_dsos_buildid(pos, fp, with_hits);
2281         }
2282         return ret;
2283 }
2284
2285 static struct dso*
2286 dso__kernel_findnew(struct machine *machine, const char *name,
2287                     const char *short_name, int dso_type)
2288 {
2289         /*
2290          * The kernel dso could be created by build_id processing.
2291          */
2292         struct dso *dso = __dsos__findnew(&machine->kernel_dsos, name);
2293
2294         /*
2295          * We need to run this in all cases, since during the build_id
2296          * processing we had no idea this was the kernel dso.
2297          */
2298         if (dso != NULL) {
2299                 dso__set_short_name(dso, short_name);
2300                 dso->kernel = dso_type;
2301         }
2302
2303         return dso;
2304 }
2305
2306 void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine)
2307 {
2308         char path[PATH_MAX];
2309
2310         if (machine__is_default_guest(machine))
2311                 return;
2312         sprintf(path, "%s/sys/kernel/notes", machine->root_dir);
2313         if (sysfs__read_build_id(path, dso->build_id,
2314                                  sizeof(dso->build_id)) == 0)
2315                 dso->has_build_id = true;
2316 }
2317
2318 static struct dso *machine__get_kernel(struct machine *machine)
2319 {
2320         const char *vmlinux_name = NULL;
2321         struct dso *kernel;
2322
2323         if (machine__is_host(machine)) {
2324                 vmlinux_name = symbol_conf.vmlinux_name;
2325                 if (!vmlinux_name)
2326                         vmlinux_name = "[kernel.kallsyms]";
2327
2328                 kernel = dso__kernel_findnew(machine, vmlinux_name,
2329                                              "[kernel]",
2330                                              DSO_TYPE_KERNEL);
2331         } else {
2332                 char bf[PATH_MAX];
2333
2334                 if (machine__is_default_guest(machine))
2335                         vmlinux_name = symbol_conf.default_guest_vmlinux_name;
2336                 if (!vmlinux_name)
2337                         vmlinux_name = machine__mmap_name(machine, bf,
2338                                                           sizeof(bf));
2339
2340                 kernel = dso__kernel_findnew(machine, vmlinux_name,
2341                                              "[guest.kernel]",
2342                                              DSO_TYPE_GUEST_KERNEL);
2343         }
2344
2345         if (kernel != NULL && (!kernel->has_build_id))
2346                 dso__read_running_kernel_build_id(kernel, machine);
2347
2348         return kernel;
2349 }
2350
2351 struct process_args {
2352         u64 start;
2353 };
2354
2355 static int symbol__in_kernel(void *arg, const char *name,
2356                              char type __used, u64 start, u64 end __used)
2357 {
2358         struct process_args *args = arg;
2359
2360         if (strchr(name, '['))
2361                 return 0;
2362
2363         args->start = start;
2364         return 1;
2365 }
2366
2367 /* Figure out the start address of kernel map from /proc/kallsyms */
2368 static u64 machine__get_kernel_start_addr(struct machine *machine)
2369 {
2370         const char *filename;
2371         char path[PATH_MAX];
2372         struct process_args args;
2373
2374         if (machine__is_host(machine)) {
2375                 filename = "/proc/kallsyms";
2376         } else {
2377                 if (machine__is_default_guest(machine))
2378                         filename = (char *)symbol_conf.default_guest_kallsyms;
2379                 else {
2380                         sprintf(path, "%s/proc/kallsyms", machine->root_dir);
2381                         filename = path;
2382                 }
2383         }
2384
2385         if (symbol__restricted_filename(filename, "/proc/kallsyms"))
2386                 return 0;
2387
2388         if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0)
2389                 return 0;
2390
2391         return args.start;
2392 }
2393
2394 int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
2395 {
2396         enum map_type type;
2397         u64 start = machine__get_kernel_start_addr(machine);
2398
2399         for (type = 0; type < MAP__NR_TYPES; ++type) {
2400                 struct kmap *kmap;
2401
2402                 machine->vmlinux_maps[type] = map__new2(start, kernel, type);
2403                 if (machine->vmlinux_maps[type] == NULL)
2404                         return -1;
2405
2406                 machine->vmlinux_maps[type]->map_ip =
2407                         machine->vmlinux_maps[type]->unmap_ip =
2408                                 identity__map_ip;
2409                 kmap = map__kmap(machine->vmlinux_maps[type]);
2410                 kmap->kmaps = &machine->kmaps;
2411                 map_groups__insert(&machine->kmaps,
2412                                    machine->vmlinux_maps[type]);
2413         }
2414
2415         return 0;
2416 }
2417
2418 void machine__destroy_kernel_maps(struct machine *machine)
2419 {
2420         enum map_type type;
2421
2422         for (type = 0; type < MAP__NR_TYPES; ++type) {
2423                 struct kmap *kmap;
2424
2425                 if (machine->vmlinux_maps[type] == NULL)
2426                         continue;
2427
2428                 kmap = map__kmap(machine->vmlinux_maps[type]);
2429                 map_groups__remove(&machine->kmaps,
2430                                    machine->vmlinux_maps[type]);
2431                 if (kmap->ref_reloc_sym) {
2432                         /*
2433                          * ref_reloc_sym is shared among all maps, so free just
2434                          * on one of them.
2435                          */
2436                         if (type == MAP__FUNCTION) {
2437                                 free((char *)kmap->ref_reloc_sym->name);
2438                                 kmap->ref_reloc_sym->name = NULL;
2439                                 free(kmap->ref_reloc_sym);
2440                         }
2441                         kmap->ref_reloc_sym = NULL;
2442                 }
2443
2444                 map__delete(machine->vmlinux_maps[type]);
2445                 machine->vmlinux_maps[type] = NULL;
2446         }
2447 }
2448
2449 int machine__create_kernel_maps(struct machine *machine)
2450 {
2451         struct dso *kernel = machine__get_kernel(machine);
2452
2453         if (kernel == NULL ||
2454             __machine__create_kernel_maps(machine, kernel) < 0)
2455                 return -1;
2456
2457         if (symbol_conf.use_modules && machine__create_modules(machine) < 0)
2458                 pr_debug("Problems creating module maps, continuing anyway...\n");
2459         /*
2460          * Now that we have all the maps created, just set the ->end of them:
2461          */
2462         map_groups__fixup_end(&machine->kmaps);
2463         return 0;
2464 }
2465
2466 static void vmlinux_path__exit(void)
2467 {
2468         while (--vmlinux_path__nr_entries >= 0) {
2469                 free(vmlinux_path[vmlinux_path__nr_entries]);
2470                 vmlinux_path[vmlinux_path__nr_entries] = NULL;
2471         }
2472
2473         free(vmlinux_path);
2474         vmlinux_path = NULL;
2475 }
2476
2477 static int vmlinux_path__init(void)
2478 {
2479         struct utsname uts;
2480         char bf[PATH_MAX];
2481
2482         vmlinux_path = malloc(sizeof(char *) * 5);
2483         if (vmlinux_path == NULL)
2484                 return -1;
2485
2486         vmlinux_path[vmlinux_path__nr_entries] = strdup("vmlinux");
2487         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2488                 goto out_fail;
2489         ++vmlinux_path__nr_entries;
2490         vmlinux_path[vmlinux_path__nr_entries] = strdup("/boot/vmlinux");
2491         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2492                 goto out_fail;
2493         ++vmlinux_path__nr_entries;
2494
2495         /* only try running kernel version if no symfs was given */
2496         if (symbol_conf.symfs[0] != 0)
2497                 return 0;
2498
2499         if (uname(&uts) < 0)
2500                 return -1;
2501
2502         snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", uts.release);
2503         vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
2504         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2505                 goto out_fail;
2506         ++vmlinux_path__nr_entries;
2507         snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", uts.release);
2508         vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
2509         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2510                 goto out_fail;
2511         ++vmlinux_path__nr_entries;
2512         snprintf(bf, sizeof(bf), "/usr/lib/debug/lib/modules/%s/vmlinux",
2513                  uts.release);
2514         vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
2515         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2516                 goto out_fail;
2517         ++vmlinux_path__nr_entries;
2518
2519         return 0;
2520
2521 out_fail:
2522         vmlinux_path__exit();
2523         return -1;
2524 }
2525
2526 size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp)
2527 {
2528         int i;
2529         size_t printed = 0;
2530         struct dso *kdso = machine->vmlinux_maps[MAP__FUNCTION]->dso;
2531
2532         if (kdso->has_build_id) {
2533                 char filename[PATH_MAX];
2534                 if (dso__build_id_filename(kdso, filename, sizeof(filename)))
2535                         printed += fprintf(fp, "[0] %s\n", filename);
2536         }
2537
2538         for (i = 0; i < vmlinux_path__nr_entries; ++i)
2539                 printed += fprintf(fp, "[%d] %s\n",
2540                                    i + kdso->has_build_id, vmlinux_path[i]);
2541
2542         return printed;
2543 }
2544
2545 static int setup_list(struct strlist **list, const char *list_str,
2546                       const char *list_name)
2547 {
2548         if (list_str == NULL)
2549                 return 0;
2550
2551         *list = strlist__new(true, list_str);
2552         if (!*list) {
2553                 pr_err("problems parsing %s list\n", list_name);
2554                 return -1;
2555         }
2556         return 0;
2557 }
2558
2559 static bool symbol__read_kptr_restrict(void)
2560 {
2561         bool value = false;
2562
2563         if (geteuid() != 0) {
2564                 FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
2565                 if (fp != NULL) {
2566                         char line[8];
2567
2568                         if (fgets(line, sizeof(line), fp) != NULL)
2569                                 value = atoi(line) != 0;
2570
2571                         fclose(fp);
2572                 }
2573         }
2574
2575         return value;
2576 }
2577
2578 int symbol__init(void)
2579 {
2580         const char *symfs;
2581
2582         if (symbol_conf.initialized)
2583                 return 0;
2584
2585         symbol_conf.priv_size = ALIGN(symbol_conf.priv_size, sizeof(u64));
2586
2587         elf_version(EV_CURRENT);
2588         if (symbol_conf.sort_by_name)
2589                 symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
2590                                           sizeof(struct symbol));
2591
2592         if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0)
2593                 return -1;
2594
2595         if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') {
2596                 pr_err("'.' is the only non valid --field-separator argument\n");
2597                 return -1;
2598         }
2599
2600         if (setup_list(&symbol_conf.dso_list,
2601                        symbol_conf.dso_list_str, "dso") < 0)
2602                 return -1;
2603
2604         if (setup_list(&symbol_conf.comm_list,
2605                        symbol_conf.comm_list_str, "comm") < 0)
2606                 goto out_free_dso_list;
2607
2608         if (setup_list(&symbol_conf.sym_list,
2609                        symbol_conf.sym_list_str, "symbol") < 0)
2610                 goto out_free_comm_list;
2611
2612         /*
2613          * A path to symbols of "/" is identical to ""
2614          * reset here for simplicity.
2615          */
2616         symfs = realpath(symbol_conf.symfs, NULL);
2617         if (symfs == NULL)
2618                 symfs = symbol_conf.symfs;
2619         if (strcmp(symfs, "/") == 0)
2620                 symbol_conf.symfs = "";
2621         if (symfs != symbol_conf.symfs)
2622                 free((void *)symfs);
2623
2624         symbol_conf.kptr_restrict = symbol__read_kptr_restrict();
2625
2626         symbol_conf.initialized = true;
2627         return 0;
2628
2629 out_free_comm_list:
2630         strlist__delete(symbol_conf.comm_list);
2631 out_free_dso_list:
2632         strlist__delete(symbol_conf.dso_list);
2633         return -1;
2634 }
2635
2636 void symbol__exit(void)
2637 {
2638         if (!symbol_conf.initialized)
2639                 return;
2640         strlist__delete(symbol_conf.sym_list);
2641         strlist__delete(symbol_conf.dso_list);
2642         strlist__delete(symbol_conf.comm_list);
2643         vmlinux_path__exit();
2644         symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL;
2645         symbol_conf.initialized = false;
2646 }
2647
2648 int machines__create_kernel_maps(struct rb_root *machines, pid_t pid)
2649 {
2650         struct machine *machine = machines__findnew(machines, pid);
2651
2652         if (machine == NULL)
2653                 return -1;
2654
2655         return machine__create_kernel_maps(machine);
2656 }
2657
2658 static int hex(char ch)
2659 {
2660         if ((ch >= '0') && (ch <= '9'))
2661                 return ch - '0';
2662         if ((ch >= 'a') && (ch <= 'f'))
2663                 return ch - 'a' + 10;
2664         if ((ch >= 'A') && (ch <= 'F'))
2665                 return ch - 'A' + 10;
2666         return -1;
2667 }
2668
2669 /*
2670  * While we find nice hex chars, build a long_val.
2671  * Return number of chars processed.
2672  */
2673 int hex2u64(const char *ptr, u64 *long_val)
2674 {
2675         const char *p = ptr;
2676         *long_val = 0;
2677
2678         while (*p) {
2679                 const int hex_val = hex(*p);
2680
2681                 if (hex_val < 0)
2682                         break;
2683
2684                 *long_val = (*long_val << 4) | hex_val;
2685                 p++;
2686         }
2687
2688         return p - ptr;
2689 }
2690
2691 char *strxfrchar(char *s, char from, char to)
2692 {
2693         char *p = s;
2694
2695         while ((p = strchr(p, from)) != NULL)
2696                 *p++ = to;
2697
2698         return s;
2699 }
2700
2701 int machines__create_guest_kernel_maps(struct rb_root *machines)
2702 {
2703         int ret = 0;
2704         struct dirent **namelist = NULL;
2705         int i, items = 0;
2706         char path[PATH_MAX];
2707         pid_t pid;
2708
2709         if (symbol_conf.default_guest_vmlinux_name ||
2710             symbol_conf.default_guest_modules ||
2711             symbol_conf.default_guest_kallsyms) {
2712                 machines__create_kernel_maps(machines, DEFAULT_GUEST_KERNEL_ID);
2713         }
2714
2715         if (symbol_conf.guestmount) {
2716                 items = scandir(symbol_conf.guestmount, &namelist, NULL, NULL);
2717                 if (items <= 0)
2718                         return -ENOENT;
2719                 for (i = 0; i < items; i++) {
2720                         if (!isdigit(namelist[i]->d_name[0])) {
2721                                 /* Filter out . and .. */
2722                                 continue;
2723                         }
2724                         pid = atoi(namelist[i]->d_name);
2725                         sprintf(path, "%s/%s/proc/kallsyms",
2726                                 symbol_conf.guestmount,
2727                                 namelist[i]->d_name);
2728                         ret = access(path, R_OK);
2729                         if (ret) {
2730                                 pr_debug("Can't access file %s\n", path);
2731                                 goto failure;
2732                         }
2733                         machines__create_kernel_maps(machines, pid);
2734                 }
2735 failure:
2736                 free(namelist);
2737         }
2738
2739         return ret;
2740 }
2741
2742 void machines__destroy_guest_kernel_maps(struct rb_root *machines)
2743 {
2744         struct rb_node *next = rb_first(machines);
2745
2746         while (next) {
2747                 struct machine *pos = rb_entry(next, struct machine, rb_node);
2748
2749                 next = rb_next(&pos->rb_node);
2750                 rb_erase(&pos->rb_node, machines);
2751                 machine__delete(pos);
2752         }
2753 }
2754
2755 int machine__load_kallsyms(struct machine *machine, const char *filename,
2756                            enum map_type type, symbol_filter_t filter)
2757 {
2758         struct map *map = machine->vmlinux_maps[type];
2759         int ret = dso__load_kallsyms(map->dso, filename, map, filter);
2760
2761         if (ret > 0) {
2762                 dso__set_loaded(map->dso, type);
2763                 /*
2764                  * Since /proc/kallsyms will have multiple sessions for the
2765                  * kernel, with modules between them, fixup the end of all
2766                  * sections.
2767                  */
2768                 __map_groups__fixup_end(&machine->kmaps, type);
2769         }
2770
2771         return ret;
2772 }
2773
2774 int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
2775                                symbol_filter_t filter)
2776 {
2777         struct map *map = machine->vmlinux_maps[type];
2778         int ret = dso__load_vmlinux_path(map->dso, map, filter);
2779
2780         if (ret > 0) {
2781                 dso__set_loaded(map->dso, type);
2782                 map__reloc_vmlinux(map);
2783         }
2784
2785         return ret;
2786 }