1 /* corefile.c 2 3 Copyright (C) 1999-2016 Free Software Foundation, Inc. 4 5 This file is part of GNU Binutils. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 20 02110-1301, USA. */ 21 22 #include "gprof.h" 23 #include "libiberty.h" 24 #include "filenames.h" 25 #include "search_list.h" 26 #include "source.h" 27 #include "symtab.h" 28 #include "hist.h" 29 #include "corefile.h" 30 #include "safe-ctype.h" 31 32 #include <stdlib.h> 33 34 bfd *core_bfd; 35 static int core_num_syms; 36 static asymbol **core_syms; 37 asection *core_text_sect; 38 void * core_text_space; 39 40 static int min_insn_size; 41 int offset_to_code; 42 43 /* For mapping symbols to specific .o files during file ordering. */ 44 struct function_map * symbol_map; 45 unsigned int symbol_map_count; 46 47 static void read_function_mappings (const char *); 48 static int core_sym_class (asymbol *); 49 static bfd_boolean get_src_info 50 (bfd_vma, const char **, const char **, int *); 51 52 extern void i386_find_call (Sym *, bfd_vma, bfd_vma); 53 extern void alpha_find_call (Sym *, bfd_vma, bfd_vma); 54 extern void vax_find_call (Sym *, bfd_vma, bfd_vma); 55 extern void tahoe_find_call (Sym *, bfd_vma, bfd_vma); 56 extern void sparc_find_call (Sym *, bfd_vma, bfd_vma); 57 extern void mips_find_call (Sym *, bfd_vma, bfd_vma); 58 extern void aarch64_find_call (Sym *, bfd_vma, bfd_vma); 59 60 static void 61 parse_error (const char *filename) 62 { 63 fprintf (stderr, _("%s: unable to parse mapping file %s.\n"), whoami, filename); 64 done (1); 65 } 66 67 /* Compare two function_map structs based on function name. 68 We want to sort in ascending order. */ 69 70 static int 71 cmp_symbol_map (const void * l, const void * r) 72 { 73 return strcmp (((struct function_map *) l)->function_name, 74 ((struct function_map *) r)->function_name); 75 } 76 77 static void 78 read_function_mappings (const char *filename) 79 { 80 FILE * file = fopen (filename, "r"); 81 char dummy[1024]; 82 int count = 0; 83 unsigned int i; 84 85 if (!file) 86 { 87 fprintf (stderr, _("%s: could not open %s.\n"), whoami, filename); 88 done (1); 89 } 90 91 /* First parse the mapping file so we know how big we need to 92 make our tables. We also do some sanity checks at this 93 time. */ 94 while (!feof (file)) 95 { 96 int matches; 97 98 matches = fscanf (file, "%[^\n:]", dummy); 99 if (!matches) 100 parse_error (filename); 101 102 /* Just skip messages about files with no symbols. */ 103 if (!strncmp (dummy, "No symbols in ", 14)) 104 { 105 matches = fscanf (file, "\n"); 106 if (matches == EOF) 107 parse_error (filename); 108 continue; 109 } 110 111 /* Don't care what else is on this line at this point. */ 112 matches = fscanf (file, "%[^\n]\n", dummy); 113 if (!matches) 114 parse_error (filename); 115 count++; 116 } 117 118 /* Now we know how big we need to make our table. */ 119 symbol_map = ((struct function_map *) 120 xmalloc (count * sizeof (struct function_map))); 121 122 /* Rewind the input file so we can read it again. */ 123 rewind (file); 124 125 /* Read each entry and put it into the table. */ 126 count = 0; 127 while (!feof (file)) 128 { 129 int matches; 130 char *tmp; 131 132 matches = fscanf (file, "%[^\n:]", dummy); 133 if (!matches) 134 parse_error (filename); 135 136 /* Just skip messages about files with no symbols. */ 137 if (!strncmp (dummy, "No symbols in ", 14)) 138 { 139 matches = fscanf (file, "\n"); 140 if (matches == EOF) 141 parse_error (filename); 142 continue; 143 } 144 145 /* dummy has the filename, go ahead and copy it. */ 146 symbol_map[count].file_name = (char *) xmalloc (strlen (dummy) + 1); 147 strcpy (symbol_map[count].file_name, dummy); 148 149 /* Now we need the function name. */ 150 matches = fscanf (file, "%[^\n]\n", dummy); 151 if (!matches) 152 parse_error (filename); 153 tmp = strrchr (dummy, ' ') + 1; 154 symbol_map[count].function_name = (char *) xmalloc (strlen (tmp) + 1); 155 strcpy (symbol_map[count].function_name, tmp); 156 count++; 157 } 158 159 /* Record the size of the map table for future reference. */ 160 symbol_map_count = count; 161 162 for (i = 0; i < symbol_map_count; ++i) 163 if (i == 0 164 || filename_cmp (symbol_map[i].file_name, symbol_map[i - 1].file_name)) 165 symbol_map[i].is_first = 1; 166 167 qsort (symbol_map, symbol_map_count, sizeof (struct function_map), cmp_symbol_map); 168 169 fclose (file); 170 } 171 172 void 173 core_init (const char * aout_name) 174 { 175 int core_sym_bytes; 176 asymbol *synthsyms; 177 long synth_count; 178 179 core_bfd = bfd_openr (aout_name, 0); 180 181 if (!core_bfd) 182 { 183 perror (aout_name); 184 done (1); 185 } 186 187 if (!bfd_check_format (core_bfd, bfd_object)) 188 { 189 fprintf (stderr, _("%s: %s: not in executable format\n"), whoami, aout_name); 190 done (1); 191 } 192 193 /* Get core's text section. */ 194 core_text_sect = bfd_get_section_by_name (core_bfd, ".text"); 195 if (!core_text_sect) 196 { 197 core_text_sect = bfd_get_section_by_name (core_bfd, "$CODE$"); 198 if (!core_text_sect) 199 { 200 fprintf (stderr, _("%s: can't find .text section in %s\n"), 201 whoami, aout_name); 202 done (1); 203 } 204 } 205 206 /* Read core's symbol table. */ 207 208 /* This will probably give us more than we need, but that's ok. */ 209 core_sym_bytes = bfd_get_symtab_upper_bound (core_bfd); 210 if (core_sym_bytes < 0) 211 { 212 fprintf (stderr, "%s: %s: %s\n", whoami, aout_name, 213 bfd_errmsg (bfd_get_error ())); 214 done (1); 215 } 216 217 core_syms = (asymbol **) xmalloc (core_sym_bytes); 218 core_num_syms = bfd_canonicalize_symtab (core_bfd, core_syms); 219 220 if (core_num_syms < 0) 221 { 222 fprintf (stderr, "%s: %s: %s\n", whoami, aout_name, 223 bfd_errmsg (bfd_get_error ())); 224 done (1); 225 } 226 227 synth_count = bfd_get_synthetic_symtab (core_bfd, core_num_syms, core_syms, 228 0, NULL, &synthsyms); 229 if (synth_count > 0) 230 { 231 asymbol **symp; 232 long new_size; 233 long i; 234 235 new_size = (core_num_syms + synth_count + 1) * sizeof (*core_syms); 236 core_syms = (asymbol **) xrealloc (core_syms, new_size); 237 symp = core_syms + core_num_syms; 238 core_num_syms += synth_count; 239 for (i = 0; i < synth_count; i++) 240 *symp++ = synthsyms + i; 241 *symp = 0; 242 } 243 244 min_insn_size = 1; 245 offset_to_code = 0; 246 247 switch (bfd_get_arch (core_bfd)) 248 { 249 case bfd_arch_vax: 250 case bfd_arch_tahoe: 251 offset_to_code = 2; 252 break; 253 254 case bfd_arch_alpha: 255 min_insn_size = 4; 256 break; 257 258 default: 259 break; 260 } 261 262 if (function_mapping_file) 263 read_function_mappings (function_mapping_file); 264 } 265 266 /* Read in the text space of an a.out file. */ 267 268 void 269 core_get_text_space (bfd *cbfd) 270 { 271 core_text_space = malloc (bfd_get_section_size (core_text_sect)); 272 273 if (!core_text_space) 274 { 275 fprintf (stderr, _("%s: ran out room for %lu bytes of text space\n"), 276 whoami, (unsigned long) bfd_get_section_size (core_text_sect)); 277 done (1); 278 } 279 280 if (!bfd_get_section_contents (cbfd, core_text_sect, core_text_space, 281 0, bfd_get_section_size (core_text_sect))) 282 { 283 bfd_perror ("bfd_get_section_contents"); 284 free (core_text_space); 285 core_text_space = 0; 286 } 287 288 if (!core_text_space) 289 fprintf (stderr, _("%s: can't do -c\n"), whoami); 290 } 291 292 293 void 294 find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc) 295 { 296 if (core_text_space == 0) 297 return; 298 299 hist_clip_symbol_address (&p_lowpc, &p_highpc); 300 301 switch (bfd_get_arch (core_bfd)) 302 { 303 case bfd_arch_i386: 304 i386_find_call (parent, p_lowpc, p_highpc); 305 break; 306 307 case bfd_arch_alpha: 308 alpha_find_call (parent, p_lowpc, p_highpc); 309 break; 310 311 case bfd_arch_vax: 312 vax_find_call (parent, p_lowpc, p_highpc); 313 break; 314 315 case bfd_arch_sparc: 316 sparc_find_call (parent, p_lowpc, p_highpc); 317 break; 318 319 case bfd_arch_tahoe: 320 tahoe_find_call (parent, p_lowpc, p_highpc); 321 break; 322 323 case bfd_arch_mips: 324 mips_find_call (parent, p_lowpc, p_highpc); 325 break; 326 327 case bfd_arch_aarch64: 328 aarch64_find_call (parent, p_lowpc, p_highpc); 329 break; 330 331 default: 332 fprintf (stderr, _("%s: -c not supported on architecture %s\n"), 333 whoami, bfd_printable_name(core_bfd)); 334 335 /* Don't give the error more than once. */ 336 ignore_direct_calls = FALSE; 337 } 338 } 339 340 /* Return class of symbol SYM. The returned class can be any of: 341 0 -> symbol is not interesting to us 342 'T' -> symbol is a global name 343 't' -> symbol is a local (static) name. */ 344 345 static int 346 core_sym_class (asymbol *sym) 347 { 348 symbol_info syminfo; 349 const char *name; 350 char sym_prefix; 351 int i; 352 353 if (sym->section == NULL || (sym->flags & BSF_DEBUGGING) != 0) 354 return 0; 355 356 /* Must be a text symbol, and static text symbols 357 don't qualify if ignore_static_funcs set. */ 358 if (ignore_static_funcs && (sym->flags & BSF_LOCAL)) 359 { 360 DBG (AOUTDEBUG, printf ("[core_sym_class] %s: not a function\n", 361 sym->name)); 362 return 0; 363 } 364 365 bfd_get_symbol_info (core_bfd, sym, &syminfo); 366 i = syminfo.type; 367 368 if (i == 'T') 369 return i; /* It's a global symbol. */ 370 371 if (i == 'W') 372 /* Treat weak symbols as text symbols. FIXME: a weak symbol may 373 also be a data symbol. */ 374 return 'T'; 375 376 if (i != 't') 377 { 378 /* Not a static text symbol. */ 379 DBG (AOUTDEBUG, printf ("[core_sym_class] %s is of class %c\n", 380 sym->name, i)); 381 return 0; 382 } 383 384 /* Do some more filtering on static function-names. */ 385 if (ignore_static_funcs) 386 return 0; 387 388 /* Can't zero-length name or funny characters in name, where 389 `funny' includes: `.' (.o file names) and `$' (Pascal labels). */ 390 if (!sym->name || sym->name[0] == '\0') 391 return 0; 392 393 for (name = sym->name; *name; ++name) 394 { 395 if (*name == '$') 396 return 0; 397 398 while (*name == '.') 399 { 400 /* Allow both nested subprograms (which end with ".NNN", where N is 401 a digit) and GCC cloned functions (which contain ".clone"). 402 Allow for multiple iterations of both - apparently GCC can clone 403 clones and subprograms. */ 404 int digit_seen = 0; 405 #define CLONE_NAME ".clone." 406 #define CLONE_NAME_LEN strlen (CLONE_NAME) 407 #define CONSTPROP_NAME ".constprop." 408 #define CONSTPROP_NAME_LEN strlen (CONSTPROP_NAME) 409 410 if (strlen (name) > CLONE_NAME_LEN 411 && strncmp (name, CLONE_NAME, CLONE_NAME_LEN) == 0) 412 name += CLONE_NAME_LEN - 1; 413 414 else if (strlen (name) > CONSTPROP_NAME_LEN 415 && strncmp (name, CONSTPROP_NAME, CONSTPROP_NAME_LEN) == 0) 416 name += CONSTPROP_NAME_LEN - 1; 417 418 for (name++; *name; name++) 419 if (digit_seen && *name == '.') 420 break; 421 else if (ISDIGIT (*name)) 422 digit_seen = 1; 423 else 424 return 0; 425 } 426 } 427 428 /* On systems where the C compiler adds an underscore to all 429 names, static names without underscores seem usually to be 430 labels in hand written assembler in the library. We don't want 431 these names. This is certainly necessary on a Sparc running 432 SunOS 4.1 (try profiling a program that does a lot of 433 division). I don't know whether it has harmful side effects on 434 other systems. Perhaps it should be made configurable. */ 435 sym_prefix = bfd_get_symbol_leading_char (core_bfd); 436 437 if ((sym_prefix && sym_prefix != sym->name[0]) 438 /* GCC may add special symbols to help gdb figure out the file 439 language. We want to ignore these, since sometimes they mask 440 the real function. (dj@ctron) */ 441 || !strncmp (sym->name, "__gnu_compiled", 14) 442 || !strncmp (sym->name, "___gnu_compiled", 15)) 443 { 444 return 0; 445 } 446 447 /* If the object file supports marking of function symbols, then 448 we can zap anything that doesn't have BSF_FUNCTION set. */ 449 if (ignore_non_functions && (sym->flags & BSF_FUNCTION) == 0) 450 return 0; 451 452 return 't'; /* It's a static text symbol. */ 453 } 454 455 /* Get whatever source info we can get regarding address ADDR. */ 456 457 static bfd_boolean 458 get_src_info (bfd_vma addr, const char **filename, const char **name, int *line_num) 459 { 460 const char *fname = 0, *func_name = 0; 461 int l = 0; 462 463 if (bfd_find_nearest_line (core_bfd, core_text_sect, core_syms, 464 addr - core_text_sect->vma, 465 &fname, &func_name, (unsigned int *) &l) 466 && fname && func_name && l) 467 { 468 DBG (AOUTDEBUG, printf ("[get_src_info] 0x%lx -> %s:%d (%s)\n", 469 (unsigned long) addr, fname, l, func_name)); 470 *filename = fname; 471 *name = func_name; 472 *line_num = l; 473 return TRUE; 474 } 475 else 476 { 477 DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n", 478 (unsigned long) addr, 479 fname ? fname : "<unknown>", l, 480 func_name ? func_name : "<unknown>")); 481 return FALSE; 482 } 483 } 484 485 /* Return number of symbols in a symbol-table file. */ 486 487 static int 488 num_of_syms_in (FILE * f) 489 { 490 const int BUFSIZE = 1024; 491 char * buf = (char *) xmalloc (BUFSIZE); 492 char * address = (char *) xmalloc (BUFSIZE); 493 char type; 494 char * name = (char *) xmalloc (BUFSIZE); 495 int num = 0; 496 497 while (!feof (f) && fgets (buf, BUFSIZE - 1, f)) 498 { 499 if (sscanf (buf, "%s %c %s", address, &type, name) == 3) 500 if (type == 't' || type == 'T') 501 ++num; 502 } 503 504 free (buf); 505 free (address); 506 free (name); 507 508 return num; 509 } 510 511 /* Read symbol table from a file. */ 512 513 void 514 core_create_syms_from (const char * sym_table_file) 515 { 516 const int BUFSIZE = 1024; 517 char * buf = (char *) xmalloc (BUFSIZE); 518 char * address = (char *) xmalloc (BUFSIZE); 519 char type; 520 char * name = (char *) xmalloc (BUFSIZE); 521 bfd_vma min_vma = ~(bfd_vma) 0; 522 bfd_vma max_vma = 0; 523 FILE * f; 524 525 f = fopen (sym_table_file, "r"); 526 if (!f) 527 { 528 fprintf (stderr, _("%s: could not open %s.\n"), whoami, sym_table_file); 529 done (1); 530 } 531 532 /* Pass 1 - determine upper bound on number of function names. */ 533 symtab.len = num_of_syms_in (f); 534 535 if (symtab.len == 0) 536 { 537 fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, sym_table_file); 538 done (1); 539 } 540 541 symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym)); 542 543 /* Pass 2 - create symbols. */ 544 symtab.limit = symtab.base; 545 546 if (fseek (f, 0, SEEK_SET) != 0) 547 { 548 perror (sym_table_file); 549 done (1); 550 } 551 552 while (!feof (f) && fgets (buf, BUFSIZE - 1, f)) 553 { 554 if (sscanf (buf, "%s %c %s", address, &type, name) == 3) 555 if (type != 't' && type != 'T') 556 continue; 557 558 sym_init (symtab.limit); 559 560 sscanf (address, "%" BFD_VMA_FMT "x", &(symtab.limit->addr) ); 561 562 symtab.limit->name = (char *) xmalloc (strlen (name) + 1); 563 strcpy ((char *) symtab.limit->name, name); 564 symtab.limit->mapped = 0; 565 symtab.limit->is_func = TRUE; 566 symtab.limit->is_bb_head = TRUE; 567 symtab.limit->is_static = (type == 't'); 568 min_vma = MIN (symtab.limit->addr, min_vma); 569 max_vma = MAX (symtab.limit->addr, max_vma); 570 571 ++symtab.limit; 572 } 573 fclose (f); 574 575 symtab.len = symtab.limit - symtab.base; 576 symtab_finalize (&symtab); 577 578 free (buf); 579 free (address); 580 free (name); 581 } 582 583 static int 584 search_mapped_symbol (const void * l, const void * r) 585 { 586 return strcmp ((const char *) l, ((const struct function_map *) r)->function_name); 587 } 588 589 /* Read in symbol table from core. 590 One symbol per function is entered. */ 591 592 void 593 core_create_function_syms (void) 594 { 595 bfd_vma min_vma = ~ (bfd_vma) 0; 596 bfd_vma max_vma = 0; 597 int cxxclass; 598 long i; 599 struct function_map * found = NULL; 600 int core_has_func_syms = 0; 601 602 switch (core_bfd->xvec->flavour) 603 { 604 default: 605 break; 606 case bfd_target_coff_flavour: 607 case bfd_target_ecoff_flavour: 608 case bfd_target_xcoff_flavour: 609 case bfd_target_elf_flavour: 610 case bfd_target_nlm_flavour: 611 case bfd_target_som_flavour: 612 core_has_func_syms = 1; 613 } 614 615 /* Pass 1 - determine upper bound on number of function names. */ 616 symtab.len = 0; 617 618 for (i = 0; i < core_num_syms; ++i) 619 { 620 if (!core_sym_class (core_syms[i])) 621 continue; 622 623 /* Don't create a symtab entry for a function that has 624 a mapping to a file, unless it's the first function 625 in the file. */ 626 if (symbol_map_count != 0) 627 { 628 /* Note: some systems (SunOS 5.8) crash if bsearch base argument 629 is NULL. */ 630 found = (struct function_map *) bsearch 631 (core_syms[i]->name, symbol_map, symbol_map_count, 632 sizeof (struct function_map), search_mapped_symbol); 633 } 634 if (found == NULL || found->is_first) 635 ++symtab.len; 636 } 637 638 if (symtab.len == 0) 639 { 640 fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, a_out_name); 641 done (1); 642 } 643 644 symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym)); 645 646 /* Pass 2 - create symbols. */ 647 symtab.limit = symtab.base; 648 649 for (i = 0; i < core_num_syms; ++i) 650 { 651 asection *sym_sec; 652 653 cxxclass = core_sym_class (core_syms[i]); 654 655 if (!cxxclass) 656 { 657 DBG (AOUTDEBUG, 658 printf ("[core_create_function_syms] rejecting: 0x%lx %s\n", 659 (unsigned long) core_syms[i]->value, 660 core_syms[i]->name)); 661 continue; 662 } 663 664 if (symbol_map_count != 0) 665 { 666 /* Note: some systems (SunOS 5.8) crash if bsearch base argument 667 is NULL. */ 668 found = (struct function_map *) bsearch 669 (core_syms[i]->name, symbol_map, symbol_map_count, 670 sizeof (struct function_map), search_mapped_symbol); 671 } 672 if (found && ! found->is_first) 673 continue; 674 675 sym_init (symtab.limit); 676 677 /* Symbol offsets are always section-relative. */ 678 sym_sec = core_syms[i]->section; 679 symtab.limit->addr = core_syms[i]->value; 680 if (sym_sec) 681 symtab.limit->addr += bfd_get_section_vma (sym_sec->owner, sym_sec); 682 683 if (found) 684 { 685 symtab.limit->name = found->file_name; 686 symtab.limit->mapped = 1; 687 } 688 else 689 { 690 symtab.limit->name = core_syms[i]->name; 691 symtab.limit->mapped = 0; 692 } 693 694 /* Lookup filename and line number, if we can. */ 695 { 696 const char * filename; 697 const char * func_name; 698 699 if (get_src_info (symtab.limit->addr, & filename, & func_name, 700 & symtab.limit->line_num)) 701 { 702 symtab.limit->file = source_file_lookup_path (filename); 703 704 /* FIXME: Checking __osf__ here does not work with a cross 705 gprof. */ 706 #ifdef __osf__ 707 /* Suppress symbols that are not function names. This is 708 useful to suppress code-labels and aliases. 709 710 This is known to be useful under DEC's OSF/1. Under SunOS 4.x, 711 labels do not appear in the symbol table info, so this isn't 712 necessary. */ 713 714 if (strcmp (symtab.limit->name, func_name) != 0) 715 { 716 /* The symbol's address maps to a different name, so 717 it can't be a function-entry point. This happens 718 for labels, for example. */ 719 DBG (AOUTDEBUG, 720 printf ("[core_create_function_syms: rej %s (maps to %s)\n", 721 symtab.limit->name, func_name)); 722 continue; 723 } 724 #endif 725 } 726 } 727 728 symtab.limit->is_func = (!core_has_func_syms 729 || (core_syms[i]->flags & BSF_FUNCTION) != 0); 730 symtab.limit->is_bb_head = TRUE; 731 732 if (cxxclass == 't') 733 symtab.limit->is_static = TRUE; 734 735 /* Keep track of the minimum and maximum vma addresses used by all 736 symbols. When computing the max_vma, use the ending address of the 737 section containing the symbol, if available. */ 738 min_vma = MIN (symtab.limit->addr, min_vma); 739 if (sym_sec) 740 max_vma = MAX (bfd_get_section_vma (sym_sec->owner, sym_sec) 741 + bfd_section_size (sym_sec->owner, sym_sec) - 1, 742 max_vma); 743 else 744 max_vma = MAX (symtab.limit->addr, max_vma); 745 746 DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n", 747 (long) (symtab.limit - symtab.base), 748 symtab.limit->name, 749 (unsigned long) symtab.limit->addr)); 750 ++symtab.limit; 751 } 752 753 symtab.len = symtab.limit - symtab.base; 754 symtab_finalize (&symtab); 755 } 756 757 /* Read in symbol table from core. 758 One symbol per line of source code is entered. */ 759 760 void 761 core_create_line_syms (void) 762 { 763 char *prev_name, *prev_filename; 764 unsigned int prev_name_len, prev_filename_len; 765 bfd_vma vma, min_vma = ~(bfd_vma) 0, max_vma = 0; 766 Sym *prev, dummy, *sym; 767 const char *filename; 768 int prev_line_num; 769 Sym_Table ltab; 770 bfd_vma vma_high; 771 772 /* Create symbols for functions as usual. This is necessary in 773 cases where parts of a program were not compiled with -g. For 774 those parts we still want to get info at the function level. */ 775 core_create_function_syms (); 776 777 /* Pass 1: count the number of symbols. */ 778 779 /* To find all line information, walk through all possible 780 text-space addresses (one by one!) and get the debugging 781 info for each address. When the debugging info changes, 782 it is time to create a new symbol. 783 784 Of course, this is rather slow and it would be better if 785 BFD would provide an iterator for enumerating all line infos. */ 786 prev_name_len = PATH_MAX; 787 prev_filename_len = PATH_MAX; 788 prev_name = (char *) xmalloc (prev_name_len); 789 prev_filename = (char *) xmalloc (prev_filename_len); 790 ltab.len = 0; 791 prev_line_num = 0; 792 793 vma_high = core_text_sect->vma + bfd_get_section_size (core_text_sect); 794 for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size) 795 { 796 unsigned int len; 797 798 if (!get_src_info (vma, &filename, &dummy.name, &dummy.line_num) 799 || (prev_line_num == dummy.line_num 800 && prev_name != NULL 801 && strcmp (prev_name, dummy.name) == 0 802 && filename_cmp (prev_filename, filename) == 0)) 803 continue; 804 805 ++ltab.len; 806 prev_line_num = dummy.line_num; 807 808 len = strlen (dummy.name); 809 if (len >= prev_name_len) 810 { 811 prev_name_len = len + 1024; 812 free (prev_name); 813 prev_name = (char *) xmalloc (prev_name_len); 814 } 815 816 strcpy (prev_name, dummy.name); 817 len = strlen (filename); 818 819 if (len >= prev_filename_len) 820 { 821 prev_filename_len = len + 1024; 822 free (prev_filename); 823 prev_filename = (char *) xmalloc (prev_filename_len); 824 } 825 826 strcpy (prev_filename, filename); 827 828 min_vma = MIN (vma, min_vma); 829 max_vma = MAX (vma, max_vma); 830 } 831 832 free (prev_name); 833 free (prev_filename); 834 835 /* Make room for function symbols, too. */ 836 ltab.len += symtab.len; 837 ltab.base = (Sym *) xmalloc (ltab.len * sizeof (Sym)); 838 ltab.limit = ltab.base; 839 840 /* Pass 2 - create symbols. */ 841 842 /* We now set is_static as we go along, rather than by running 843 through the symbol table at the end. 844 845 The old way called symtab_finalize before the is_static pass, 846 causing a problem since symtab_finalize uses is_static as part of 847 its address conflict resolution algorithm. Since global symbols 848 were prefered over static symbols, and all line symbols were 849 global at that point, static function names that conflicted with 850 their own line numbers (static, but labeled as global) were 851 rejected in favor of the line num. 852 853 This was not the desired functionality. We always want to keep 854 our function symbols and discard any conflicting line symbols. 855 Perhaps symtab_finalize should be modified to make this 856 distinction as well, but the current fix works and the code is a 857 lot cleaner now. */ 858 prev = 0; 859 860 for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size) 861 { 862 sym_init (ltab.limit); 863 864 if (!get_src_info (vma, &filename, <ab.limit->name, <ab.limit->line_num) 865 || (prev && prev->line_num == ltab.limit->line_num 866 && strcmp (prev->name, ltab.limit->name) == 0 867 && filename_cmp (prev->file->name, filename) == 0)) 868 continue; 869 870 /* Make name pointer a malloc'ed string. */ 871 ltab.limit->name = xstrdup (ltab.limit->name); 872 ltab.limit->file = source_file_lookup_path (filename); 873 874 ltab.limit->addr = vma; 875 876 /* Set is_static based on the enclosing function, using either: 877 1) the previous symbol, if it's from the same function, or 878 2) a symtab lookup. */ 879 if (prev && ltab.limit->file == prev->file && 880 strcmp (ltab.limit->name, prev->name) == 0) 881 { 882 ltab.limit->is_static = prev->is_static; 883 } 884 else 885 { 886 sym = sym_lookup(&symtab, ltab.limit->addr); 887 if (sym) 888 ltab.limit->is_static = sym->is_static; 889 } 890 891 prev = ltab.limit; 892 893 DBG (AOUTDEBUG, printf ("[core_create_line_syms] %lu %s 0x%lx\n", 894 (unsigned long) (ltab.limit - ltab.base), 895 ltab.limit->name, 896 (unsigned long) ltab.limit->addr)); 897 ++ltab.limit; 898 } 899 900 /* Copy in function symbols. */ 901 memcpy (ltab.limit, symtab.base, symtab.len * sizeof (Sym)); 902 ltab.limit += symtab.len; 903 904 if ((unsigned int) (ltab.limit - ltab.base) != ltab.len) 905 { 906 fprintf (stderr, 907 _("%s: somebody miscounted: ltab.len=%d instead of %ld\n"), 908 whoami, ltab.len, (long) (ltab.limit - ltab.base)); 909 done (1); 910 } 911 912 /* Finalize ltab and make it symbol table. */ 913 symtab_finalize (<ab); 914 free (symtab.base); 915 symtab = ltab; 916 } 917