Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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