1 /* 2 * kallsyms.c: in-kernel printing of symbolic oopses and stack traces. 3 * 4 * Rewritten and vastly simplified by Rusty Russell for in-kernel 5 * module loader: 6 * Copyright 2002 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation 7 * 8 * ChangeLog: 9 * 10 * (25/Aug/2004) Paulo Marques <pmarques@grupopie.com> 11 * Changed the compression method from stem compression to "table lookup" 12 * compression (see scripts/kallsyms.c for a more complete description) 13 */ 14 #include <linux/kallsyms.h> 15 #include <linux/module.h> 16 #include <linux/init.h> 17 #include <linux/seq_file.h> 18 #include <linux/fs.h> 19 #include <linux/kdb.h> 20 #include <linux/err.h> 21 #include <linux/proc_fs.h> 22 #include <linux/sched.h> /* for cond_resched */ 23 #include <linux/mm.h> 24 #include <linux/ctype.h> 25 #include <linux/slab.h> 26 #include <linux/filter.h> 27 #include <linux/ftrace.h> 28 #include <linux/compiler.h> 29 30 #include <asm/sections.h> 31 32 /* 33 * These will be re-linked against their real values 34 * during the second link stage. 35 */ 36 extern const unsigned long kallsyms_addresses[] __weak; 37 extern const int kallsyms_offsets[] __weak; 38 extern const u8 kallsyms_names[] __weak; 39 40 /* 41 * Tell the compiler that the count isn't in the small data section if the arch 42 * has one (eg: FRV). 43 */ 44 extern const unsigned long kallsyms_num_syms 45 __attribute__((weak, section(".rodata"))); 46 47 extern const unsigned long kallsyms_relative_base 48 __attribute__((weak, section(".rodata"))); 49 50 extern const u8 kallsyms_token_table[] __weak; 51 extern const u16 kallsyms_token_index[] __weak; 52 53 extern const unsigned long kallsyms_markers[] __weak; 54 55 static inline int is_kernel_inittext(unsigned long addr) 56 { 57 if (addr >= (unsigned long)_sinittext 58 && addr <= (unsigned long)_einittext) 59 return 1; 60 return 0; 61 } 62 63 static inline int is_kernel_text(unsigned long addr) 64 { 65 if ((addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) || 66 arch_is_kernel_text(addr)) 67 return 1; 68 return in_gate_area_no_mm(addr); 69 } 70 71 static inline int is_kernel(unsigned long addr) 72 { 73 if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end) 74 return 1; 75 return in_gate_area_no_mm(addr); 76 } 77 78 static int is_ksym_addr(unsigned long addr) 79 { 80 if (IS_ENABLED(CONFIG_KALLSYMS_ALL)) 81 return is_kernel(addr); 82 83 return is_kernel_text(addr) || is_kernel_inittext(addr); 84 } 85 86 /* 87 * Expand a compressed symbol data into the resulting uncompressed string, 88 * if uncompressed string is too long (>= maxlen), it will be truncated, 89 * given the offset to where the symbol is in the compressed stream. 90 */ 91 static unsigned int kallsyms_expand_symbol(unsigned int off, 92 char *result, size_t maxlen) 93 { 94 int len, skipped_first = 0; 95 const u8 *tptr, *data; 96 97 /* Get the compressed symbol length from the first symbol byte. */ 98 data = &kallsyms_names[off]; 99 len = *data; 100 data++; 101 102 /* 103 * Update the offset to return the offset for the next symbol on 104 * the compressed stream. 105 */ 106 off += len + 1; 107 108 /* 109 * For every byte on the compressed symbol data, copy the table 110 * entry for that byte. 111 */ 112 while (len) { 113 tptr = &kallsyms_token_table[kallsyms_token_index[*data]]; 114 data++; 115 len--; 116 117 while (*tptr) { 118 if (skipped_first) { 119 if (maxlen <= 1) 120 goto tail; 121 *result = *tptr; 122 result++; 123 maxlen--; 124 } else 125 skipped_first = 1; 126 tptr++; 127 } 128 } 129 130 tail: 131 if (maxlen) 132 *result = '\0'; 133 134 /* Return to offset to the next symbol. */ 135 return off; 136 } 137 138 /* 139 * Get symbol type information. This is encoded as a single char at the 140 * beginning of the symbol name. 141 */ 142 static char kallsyms_get_symbol_type(unsigned int off) 143 { 144 /* 145 * Get just the first code, look it up in the token table, 146 * and return the first char from this token. 147 */ 148 return kallsyms_token_table[kallsyms_token_index[kallsyms_names[off + 1]]]; 149 } 150 151 152 /* 153 * Find the offset on the compressed stream given and index in the 154 * kallsyms array. 155 */ 156 static unsigned int get_symbol_offset(unsigned long pos) 157 { 158 const u8 *name; 159 int i; 160 161 /* 162 * Use the closest marker we have. We have markers every 256 positions, 163 * so that should be close enough. 164 */ 165 name = &kallsyms_names[kallsyms_markers[pos >> 8]]; 166 167 /* 168 * Sequentially scan all the symbols up to the point we're searching 169 * for. Every symbol is stored in a [<len>][<len> bytes of data] format, 170 * so we just need to add the len to the current pointer for every 171 * symbol we wish to skip. 172 */ 173 for (i = 0; i < (pos & 0xFF); i++) 174 name = name + (*name) + 1; 175 176 return name - kallsyms_names; 177 } 178 179 static unsigned long kallsyms_sym_address(int idx) 180 { 181 if (!IS_ENABLED(CONFIG_KALLSYMS_BASE_RELATIVE)) 182 return kallsyms_addresses[idx]; 183 184 /* values are unsigned offsets if --absolute-percpu is not in effect */ 185 if (!IS_ENABLED(CONFIG_KALLSYMS_ABSOLUTE_PERCPU)) 186 return kallsyms_relative_base + (u32)kallsyms_offsets[idx]; 187 188 /* ...otherwise, positive offsets are absolute values */ 189 if (kallsyms_offsets[idx] >= 0) 190 return kallsyms_offsets[idx]; 191 192 /* ...and negative offsets are relative to kallsyms_relative_base - 1 */ 193 return kallsyms_relative_base - 1 - kallsyms_offsets[idx]; 194 } 195 196 /* Lookup the address for this symbol. Returns 0 if not found. */ 197 unsigned long kallsyms_lookup_name(const char *name) 198 { 199 char namebuf[KSYM_NAME_LEN]; 200 unsigned long i; 201 unsigned int off; 202 203 for (i = 0, off = 0; i < kallsyms_num_syms; i++) { 204 off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); 205 206 if (strcmp(namebuf, name) == 0) 207 return kallsyms_sym_address(i); 208 } 209 return module_kallsyms_lookup_name(name); 210 } 211 EXPORT_SYMBOL_GPL(kallsyms_lookup_name); 212 213 int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, 214 unsigned long), 215 void *data) 216 { 217 char namebuf[KSYM_NAME_LEN]; 218 unsigned long i; 219 unsigned int off; 220 int ret; 221 222 for (i = 0, off = 0; i < kallsyms_num_syms; i++) { 223 off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); 224 ret = fn(data, namebuf, NULL, kallsyms_sym_address(i)); 225 if (ret != 0) 226 return ret; 227 } 228 return module_kallsyms_on_each_symbol(fn, data); 229 } 230 EXPORT_SYMBOL_GPL(kallsyms_on_each_symbol); 231 232 static unsigned long get_symbol_pos(unsigned long addr, 233 unsigned long *symbolsize, 234 unsigned long *offset) 235 { 236 unsigned long symbol_start = 0, symbol_end = 0; 237 unsigned long i, low, high, mid; 238 239 /* This kernel should never had been booted. */ 240 if (!IS_ENABLED(CONFIG_KALLSYMS_BASE_RELATIVE)) 241 BUG_ON(!kallsyms_addresses); 242 else 243 BUG_ON(!kallsyms_offsets); 244 245 /* Do a binary search on the sorted kallsyms_addresses array. */ 246 low = 0; 247 high = kallsyms_num_syms; 248 249 while (high - low > 1) { 250 mid = low + (high - low) / 2; 251 if (kallsyms_sym_address(mid) <= addr) 252 low = mid; 253 else 254 high = mid; 255 } 256 257 /* 258 * Search for the first aliased symbol. Aliased 259 * symbols are symbols with the same address. 260 */ 261 while (low && kallsyms_sym_address(low-1) == kallsyms_sym_address(low)) 262 --low; 263 264 symbol_start = kallsyms_sym_address(low); 265 266 /* Search for next non-aliased symbol. */ 267 for (i = low + 1; i < kallsyms_num_syms; i++) { 268 if (kallsyms_sym_address(i) > symbol_start) { 269 symbol_end = kallsyms_sym_address(i); 270 break; 271 } 272 } 273 274 /* If we found no next symbol, we use the end of the section. */ 275 if (!symbol_end) { 276 if (is_kernel_inittext(addr)) 277 symbol_end = (unsigned long)_einittext; 278 else if (IS_ENABLED(CONFIG_KALLSYMS_ALL)) 279 symbol_end = (unsigned long)_end; 280 else 281 symbol_end = (unsigned long)_etext; 282 } 283 284 if (symbolsize) 285 *symbolsize = symbol_end - symbol_start; 286 if (offset) 287 *offset = addr - symbol_start; 288 289 return low; 290 } 291 292 /* 293 * Lookup an address but don't bother to find any names. 294 */ 295 int kallsyms_lookup_size_offset(unsigned long addr, unsigned long *symbolsize, 296 unsigned long *offset) 297 { 298 char namebuf[KSYM_NAME_LEN]; 299 300 if (is_ksym_addr(addr)) 301 return !!get_symbol_pos(addr, symbolsize, offset); 302 return !!module_address_lookup(addr, symbolsize, offset, NULL, namebuf) || 303 !!__bpf_address_lookup(addr, symbolsize, offset, namebuf); 304 } 305 306 /* 307 * Lookup an address 308 * - modname is set to NULL if it's in the kernel. 309 * - We guarantee that the returned name is valid until we reschedule even if. 310 * It resides in a module. 311 * - We also guarantee that modname will be valid until rescheduled. 312 */ 313 const char *kallsyms_lookup(unsigned long addr, 314 unsigned long *symbolsize, 315 unsigned long *offset, 316 char **modname, char *namebuf) 317 { 318 const char *ret; 319 320 namebuf[KSYM_NAME_LEN - 1] = 0; 321 namebuf[0] = 0; 322 323 if (is_ksym_addr(addr)) { 324 unsigned long pos; 325 326 pos = get_symbol_pos(addr, symbolsize, offset); 327 /* Grab name */ 328 kallsyms_expand_symbol(get_symbol_offset(pos), 329 namebuf, KSYM_NAME_LEN); 330 if (modname) 331 *modname = NULL; 332 return namebuf; 333 } 334 335 /* See if it's in a module or a BPF JITed image. */ 336 ret = module_address_lookup(addr, symbolsize, offset, 337 modname, namebuf); 338 if (!ret) 339 ret = bpf_address_lookup(addr, symbolsize, 340 offset, modname, namebuf); 341 342 if (!ret) 343 ret = ftrace_mod_address_lookup(addr, symbolsize, 344 offset, modname, namebuf); 345 return ret; 346 } 347 348 int lookup_symbol_name(unsigned long addr, char *symname) 349 { 350 symname[0] = '\0'; 351 symname[KSYM_NAME_LEN - 1] = '\0'; 352 353 if (is_ksym_addr(addr)) { 354 unsigned long pos; 355 356 pos = get_symbol_pos(addr, NULL, NULL); 357 /* Grab name */ 358 kallsyms_expand_symbol(get_symbol_offset(pos), 359 symname, KSYM_NAME_LEN); 360 return 0; 361 } 362 /* See if it's in a module. */ 363 return lookup_module_symbol_name(addr, symname); 364 } 365 366 int lookup_symbol_attrs(unsigned long addr, unsigned long *size, 367 unsigned long *offset, char *modname, char *name) 368 { 369 name[0] = '\0'; 370 name[KSYM_NAME_LEN - 1] = '\0'; 371 372 if (is_ksym_addr(addr)) { 373 unsigned long pos; 374 375 pos = get_symbol_pos(addr, size, offset); 376 /* Grab name */ 377 kallsyms_expand_symbol(get_symbol_offset(pos), 378 name, KSYM_NAME_LEN); 379 modname[0] = '\0'; 380 return 0; 381 } 382 /* See if it's in a module. */ 383 return lookup_module_symbol_attrs(addr, size, offset, modname, name); 384 } 385 386 /* Look up a kernel symbol and return it in a text buffer. */ 387 static int __sprint_symbol(char *buffer, unsigned long address, 388 int symbol_offset, int add_offset) 389 { 390 char *modname; 391 const char *name; 392 unsigned long offset, size; 393 int len; 394 395 address += symbol_offset; 396 name = kallsyms_lookup(address, &size, &offset, &modname, buffer); 397 if (!name) 398 return sprintf(buffer, "0x%lx", address - symbol_offset); 399 400 if (name != buffer) 401 strcpy(buffer, name); 402 len = strlen(buffer); 403 offset -= symbol_offset; 404 405 if (add_offset) 406 len += sprintf(buffer + len, "+%#lx/%#lx", offset, size); 407 408 if (modname) 409 len += sprintf(buffer + len, " [%s]", modname); 410 411 return len; 412 } 413 414 /** 415 * sprint_symbol - Look up a kernel symbol and return it in a text buffer 416 * @buffer: buffer to be stored 417 * @address: address to lookup 418 * 419 * This function looks up a kernel symbol with @address and stores its name, 420 * offset, size and module name to @buffer if possible. If no symbol was found, 421 * just saves its @address as is. 422 * 423 * This function returns the number of bytes stored in @buffer. 424 */ 425 int sprint_symbol(char *buffer, unsigned long address) 426 { 427 return __sprint_symbol(buffer, address, 0, 1); 428 } 429 EXPORT_SYMBOL_GPL(sprint_symbol); 430 431 /** 432 * sprint_symbol_no_offset - Look up a kernel symbol and return it in a text buffer 433 * @buffer: buffer to be stored 434 * @address: address to lookup 435 * 436 * This function looks up a kernel symbol with @address and stores its name 437 * and module name to @buffer if possible. If no symbol was found, just saves 438 * its @address as is. 439 * 440 * This function returns the number of bytes stored in @buffer. 441 */ 442 int sprint_symbol_no_offset(char *buffer, unsigned long address) 443 { 444 return __sprint_symbol(buffer, address, 0, 0); 445 } 446 EXPORT_SYMBOL_GPL(sprint_symbol_no_offset); 447 448 /** 449 * sprint_backtrace - Look up a backtrace symbol and return it in a text buffer 450 * @buffer: buffer to be stored 451 * @address: address to lookup 452 * 453 * This function is for stack backtrace and does the same thing as 454 * sprint_symbol() but with modified/decreased @address. If there is a 455 * tail-call to the function marked "noreturn", gcc optimized out code after 456 * the call so that the stack-saved return address could point outside of the 457 * caller. This function ensures that kallsyms will find the original caller 458 * by decreasing @address. 459 * 460 * This function returns the number of bytes stored in @buffer. 461 */ 462 int sprint_backtrace(char *buffer, unsigned long address) 463 { 464 return __sprint_symbol(buffer, address, -1, 1); 465 } 466 467 /* Look up a kernel symbol and print it to the kernel messages. */ 468 void __print_symbol(const char *fmt, unsigned long address) 469 { 470 char buffer[KSYM_SYMBOL_LEN]; 471 472 sprint_symbol(buffer, address); 473 474 printk(fmt, buffer); 475 } 476 EXPORT_SYMBOL(__print_symbol); 477 478 /* To avoid using get_symbol_offset for every symbol, we carry prefix along. */ 479 struct kallsym_iter { 480 loff_t pos; 481 loff_t pos_mod_end; 482 loff_t pos_ftrace_mod_end; 483 unsigned long value; 484 unsigned int nameoff; /* If iterating in core kernel symbols. */ 485 char type; 486 char name[KSYM_NAME_LEN]; 487 char module_name[MODULE_NAME_LEN]; 488 int exported; 489 int show_value; 490 }; 491 492 static int get_ksymbol_mod(struct kallsym_iter *iter) 493 { 494 int ret = module_get_kallsym(iter->pos - kallsyms_num_syms, 495 &iter->value, &iter->type, 496 iter->name, iter->module_name, 497 &iter->exported); 498 if (ret < 0) { 499 iter->pos_mod_end = iter->pos; 500 return 0; 501 } 502 503 return 1; 504 } 505 506 static int get_ksymbol_ftrace_mod(struct kallsym_iter *iter) 507 { 508 int ret = ftrace_mod_get_kallsym(iter->pos - iter->pos_mod_end, 509 &iter->value, &iter->type, 510 iter->name, iter->module_name, 511 &iter->exported); 512 if (ret < 0) { 513 iter->pos_ftrace_mod_end = iter->pos; 514 return 0; 515 } 516 517 return 1; 518 } 519 520 static int get_ksymbol_bpf(struct kallsym_iter *iter) 521 { 522 iter->module_name[0] = '\0'; 523 iter->exported = 0; 524 return bpf_get_kallsym(iter->pos - iter->pos_ftrace_mod_end, 525 &iter->value, &iter->type, 526 iter->name) < 0 ? 0 : 1; 527 } 528 529 /* Returns space to next name. */ 530 static unsigned long get_ksymbol_core(struct kallsym_iter *iter) 531 { 532 unsigned off = iter->nameoff; 533 534 iter->module_name[0] = '\0'; 535 iter->value = kallsyms_sym_address(iter->pos); 536 537 iter->type = kallsyms_get_symbol_type(off); 538 539 off = kallsyms_expand_symbol(off, iter->name, ARRAY_SIZE(iter->name)); 540 541 return off - iter->nameoff; 542 } 543 544 static void reset_iter(struct kallsym_iter *iter, loff_t new_pos) 545 { 546 iter->name[0] = '\0'; 547 iter->nameoff = get_symbol_offset(new_pos); 548 iter->pos = new_pos; 549 if (new_pos == 0) { 550 iter->pos_mod_end = 0; 551 iter->pos_ftrace_mod_end = 0; 552 } 553 } 554 555 static int update_iter_mod(struct kallsym_iter *iter, loff_t pos) 556 { 557 iter->pos = pos; 558 559 if (iter->pos_ftrace_mod_end > 0 && 560 iter->pos_ftrace_mod_end < iter->pos) 561 return get_ksymbol_bpf(iter); 562 563 if (iter->pos_mod_end > 0 && 564 iter->pos_mod_end < iter->pos) { 565 if (!get_ksymbol_ftrace_mod(iter)) 566 return get_ksymbol_bpf(iter); 567 return 1; 568 } 569 570 if (!get_ksymbol_mod(iter)) { 571 if (!get_ksymbol_ftrace_mod(iter)) 572 return get_ksymbol_bpf(iter); 573 } 574 575 return 1; 576 } 577 578 /* Returns false if pos at or past end of file. */ 579 static int update_iter(struct kallsym_iter *iter, loff_t pos) 580 { 581 /* Module symbols can be accessed randomly. */ 582 if (pos >= kallsyms_num_syms) 583 return update_iter_mod(iter, pos); 584 585 /* If we're not on the desired position, reset to new position. */ 586 if (pos != iter->pos) 587 reset_iter(iter, pos); 588 589 iter->nameoff += get_ksymbol_core(iter); 590 iter->pos++; 591 592 return 1; 593 } 594 595 static void *s_next(struct seq_file *m, void *p, loff_t *pos) 596 { 597 (*pos)++; 598 599 if (!update_iter(m->private, *pos)) 600 return NULL; 601 return p; 602 } 603 604 static void *s_start(struct seq_file *m, loff_t *pos) 605 { 606 if (!update_iter(m->private, *pos)) 607 return NULL; 608 return m->private; 609 } 610 611 static void s_stop(struct seq_file *m, void *p) 612 { 613 } 614 615 static int s_show(struct seq_file *m, void *p) 616 { 617 void *value; 618 struct kallsym_iter *iter = m->private; 619 620 /* Some debugging symbols have no name. Ignore them. */ 621 if (!iter->name[0]) 622 return 0; 623 624 value = iter->show_value ? (void *)iter->value : NULL; 625 626 if (iter->module_name[0]) { 627 char type; 628 629 /* 630 * Label it "global" if it is exported, 631 * "local" if not exported. 632 */ 633 type = iter->exported ? toupper(iter->type) : 634 tolower(iter->type); 635 seq_printf(m, "%px %c %s\t[%s]\n", value, 636 type, iter->name, iter->module_name); 637 } else 638 seq_printf(m, "%px %c %s\n", value, 639 iter->type, iter->name); 640 return 0; 641 } 642 643 static const struct seq_operations kallsyms_op = { 644 .start = s_start, 645 .next = s_next, 646 .stop = s_stop, 647 .show = s_show 648 }; 649 650 static inline int kallsyms_for_perf(void) 651 { 652 #ifdef CONFIG_PERF_EVENTS 653 extern int sysctl_perf_event_paranoid; 654 if (sysctl_perf_event_paranoid <= 1) 655 return 1; 656 #endif 657 return 0; 658 } 659 660 /* 661 * We show kallsyms information even to normal users if we've enabled 662 * kernel profiling and are explicitly not paranoid (so kptr_restrict 663 * is clear, and sysctl_perf_event_paranoid isn't set). 664 * 665 * Otherwise, require CAP_SYSLOG (assuming kptr_restrict isn't set to 666 * block even that). 667 */ 668 int kallsyms_show_value(void) 669 { 670 switch (kptr_restrict) { 671 case 0: 672 if (kallsyms_for_perf()) 673 return 1; 674 /* fallthrough */ 675 case 1: 676 if (has_capability_noaudit(current, CAP_SYSLOG)) 677 return 1; 678 /* fallthrough */ 679 default: 680 return 0; 681 } 682 } 683 684 static int kallsyms_open(struct inode *inode, struct file *file) 685 { 686 /* 687 * We keep iterator in m->private, since normal case is to 688 * s_start from where we left off, so we avoid doing 689 * using get_symbol_offset for every symbol. 690 */ 691 struct kallsym_iter *iter; 692 iter = __seq_open_private(file, &kallsyms_op, sizeof(*iter)); 693 if (!iter) 694 return -ENOMEM; 695 reset_iter(iter, 0); 696 697 iter->show_value = kallsyms_show_value(); 698 return 0; 699 } 700 701 #ifdef CONFIG_KGDB_KDB 702 const char *kdb_walk_kallsyms(loff_t *pos) 703 { 704 static struct kallsym_iter kdb_walk_kallsyms_iter; 705 if (*pos == 0) { 706 memset(&kdb_walk_kallsyms_iter, 0, 707 sizeof(kdb_walk_kallsyms_iter)); 708 reset_iter(&kdb_walk_kallsyms_iter, 0); 709 } 710 while (1) { 711 if (!update_iter(&kdb_walk_kallsyms_iter, *pos)) 712 return NULL; 713 ++*pos; 714 /* Some debugging symbols have no name. Ignore them. */ 715 if (kdb_walk_kallsyms_iter.name[0]) 716 return kdb_walk_kallsyms_iter.name; 717 } 718 } 719 #endif /* CONFIG_KGDB_KDB */ 720 721 static const struct file_operations kallsyms_operations = { 722 .open = kallsyms_open, 723 .read = seq_read, 724 .llseek = seq_lseek, 725 .release = seq_release_private, 726 }; 727 728 static int __init kallsyms_init(void) 729 { 730 proc_create("kallsyms", 0444, NULL, &kallsyms_operations); 731 return 0; 732 } 733 device_initcall(kallsyms_init); 734