xref: /netbsd-src/external/gpl3/binutils.old/dist/gprof/corefile.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
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, &ltab.limit->name, &ltab.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 (&ltab);
914   free (symtab.base);
915   symtab = ltab;
916 }
917