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