]> Git Repo - binutils.git/blob - gdb/dbxread.c
* maint.c: Fix dereference of pointer.
[binutils.git] / gdb / dbxread.c
1 /* Read dbx symbol tables and convert to internal format, for GDB.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
3    Free Software Foundation, Inc.
4
5 This file is part of GDB.
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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /* This module provides three functions: dbx_symfile_init,
22    which initializes to read a symbol file; dbx_new_init, which 
23    discards existing cached information when all symbols are being
24    discarded; and dbx_symfile_read, which reads a symbol table
25    from a file.
26
27    dbx_symfile_read only does the minimum work necessary for letting the
28    user "name" things symbolically; it does not read the entire symtab.
29    Instead, it reads the external and static symbols and puts them in partial
30    symbol tables.  When more extensive information is requested of a
31    file, the corresponding partial symbol table is mutated into a full
32    fledged symbol table by going back and reading the symbols
33    for real.  dbx_psymtab_to_symtab() is the function that does this */
34
35 #include "defs.h"
36 #include "gdb_string.h"
37
38 #if defined(USG) || defined(__CYGNUSCLIB__)
39 #include <sys/types.h>
40 #include <fcntl.h>
41 #endif
42
43 #include "obstack.h"
44 #include "gdb_stat.h"
45 #include <ctype.h>
46 #include "symtab.h"
47 #include "breakpoint.h"
48 #include "command.h"
49 #include "target.h"
50 #include "gdbcore.h"            /* for bfd stuff */
51 #include "libaout.h"            /* FIXME Secret internal BFD stuff for a.out */
52 #include "symfile.h"
53 #include "objfiles.h"
54 #include "buildsym.h"
55 #include "stabsread.h"
56 #include "gdb-stabs.h"
57 #include "demangle.h"
58 #include "language.h"           /* Needed inside partial-stab.h */
59 #include "complaints.h"
60
61 #include "aout/aout64.h"
62 #include "aout/stab_gnu.h"      /* We always use GNU stabs, not native, now */
63
64 \f
65 /* We put a pointer to this structure in the read_symtab_private field
66    of the psymtab.  */
67
68 struct symloc {
69
70   /* Offset within the file symbol table of first local symbol for this
71      file.  */
72
73   int ldsymoff;
74
75   /* Length (in bytes) of the section of the symbol table devoted to
76      this file's symbols (actually, the section bracketed may contain
77      more than just this file's symbols).  If ldsymlen is 0, the only
78      reason for this thing's existence is the dependency list.  Nothing
79      else will happen when it is read in.  */
80
81   int ldsymlen;
82
83   /* The size of each symbol in the symbol file (in external form).  */
84
85   int symbol_size;
86
87   /* Further information needed to locate the symbols if they are in
88      an ELF file.  */
89
90   int symbol_offset;
91   int string_offset;
92   int file_string_offset;
93 };
94
95 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
96 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
97 #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
98 #define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
99 #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
100 #define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
101 #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset)
102
103 \f
104 /* Macro to determine which symbols to ignore when reading the first symbol
105    of a file.  Some machines override this definition. */
106 #ifndef IGNORE_SYMBOL
107 /* This code is used on Ultrix systems.  Ignore it */
108 #define IGNORE_SYMBOL(type)  (type == (int)N_NSYMS)
109 #endif
110
111 /* Remember what we deduced to be the source language of this psymtab. */
112
113 static enum language psymtab_language = language_unknown;
114
115 /* Nonzero means give verbose info on gdb action.  From main.c.  */
116 extern int info_verbose;
117
118 /* The BFD for this file -- implicit parameter to next_symbol_text.  */
119
120 static bfd *symfile_bfd;
121
122 /* The size of each symbol in the symbol file (in external form).
123    This is set by dbx_symfile_read when building psymtabs, and by
124    dbx_psymtab_to_symtab when building symtabs.  */
125
126 static unsigned symbol_size;
127
128 /* This is the offset of the symbol table in the executable file */
129 static unsigned symbol_table_offset;
130
131 /* This is the offset of the string table in the executable file */
132 static unsigned string_table_offset;
133
134 /* For elf+stab executables, the n_strx field is not a simple index
135    into the string table.  Instead, each .o file has a base offset
136    in the string table, and the associated symbols contain offsets
137    from this base.  The following two variables contain the base
138    offset for the current and next .o files. */
139 static unsigned int file_string_table_offset;
140 static unsigned int next_file_string_table_offset;
141
142 /* .o and NLM files contain unrelocated addresses which are based at 0.  When
143    non-zero, this flag disables some of the special cases for Solaris elf+stab
144    text addresses at location 0. */
145
146 static int symfile_relocatable = 0;
147
148   /* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are relative
149      to the function start address.  */
150
151 static int block_address_function_relative = 0;
152 \f
153 /* The lowest text address we have yet encountered.  This is needed
154    because in an a.out file, there is no header field which tells us
155    what address the program is actually going to be loaded at, so we
156    need to make guesses based on the symbols (which *are* relocated to
157    reflect the address it will be loaded at).  */
158 static CORE_ADDR lowest_text_address;
159
160 /* Complaints about the symbols we have encountered.  */
161
162 struct complaint lbrac_complaint = 
163   {"bad block start address patched", 0, 0};
164
165 struct complaint string_table_offset_complaint =
166   {"bad string table offset in symbol %d", 0, 0};
167
168 struct complaint unknown_symtype_complaint =
169   {"unknown symbol type %s", 0, 0};
170
171 struct complaint unknown_symchar_complaint =
172   {"unknown symbol descriptor `%c'", 0, 0};
173
174 struct complaint lbrac_rbrac_complaint =
175   {"block start larger than block end", 0, 0};
176
177 struct complaint lbrac_unmatched_complaint =
178   {"unmatched N_LBRAC before symtab pos %d", 0, 0};
179
180 struct complaint lbrac_mismatch_complaint =
181   {"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
182
183 struct complaint repeated_header_complaint =
184   {"\"repeated\" header file %s not previously seen, at symtab pos %d", 0, 0};
185 \f
186 /* During initial symbol readin, we need to have a structure to keep
187    track of which psymtabs have which bincls in them.  This structure
188    is used during readin to setup the list of dependencies within each
189    partial symbol table. */
190
191 struct header_file_location
192 {
193   char *name;                   /* Name of header file */
194   int instance;                 /* See above */
195   struct partial_symtab *pst;   /* Partial symtab that has the
196                                    BINCL/EINCL defs for this file */
197 };
198
199 /* The actual list and controling variables */
200 static struct header_file_location *bincl_list, *next_bincl;
201 static int bincls_allocated;
202
203 /* Local function prototypes */
204
205 static void 
206 process_now PARAMS ((struct objfile *));
207
208 static void
209 free_header_files PARAMS ((void));
210
211 static void
212 init_header_files PARAMS ((void));
213
214 static void
215 read_ofile_symtab PARAMS ((struct partial_symtab *));
216
217 static void
218 dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *));
219
220 static void
221 dbx_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
222
223 static void
224 read_dbx_dynamic_symtab PARAMS ((struct section_offsets *,
225                                  struct objfile *objfile));
226
227 static void
228 read_dbx_symtab PARAMS ((struct section_offsets *, struct objfile *,
229                          CORE_ADDR, int));
230
231 static void
232 free_bincl_list PARAMS ((struct objfile *));
233
234 static struct partial_symtab *
235 find_corresponding_bincl_psymtab PARAMS ((char *, int));
236
237 static void
238 add_bincl_to_list PARAMS ((struct partial_symtab *, char *, int));
239
240 static void
241 init_bincl_list PARAMS ((int, struct objfile *));
242
243 static char *
244 dbx_next_symbol_text PARAMS ((struct objfile *));
245
246 static void
247 fill_symbuf PARAMS ((bfd *));
248
249 static void
250 dbx_symfile_init PARAMS ((struct objfile *));
251
252 static void
253 dbx_new_init PARAMS ((struct objfile *));
254
255 static void
256 dbx_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
257
258 static void
259 dbx_symfile_finish PARAMS ((struct objfile *));
260
261 static void
262 record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *));
263
264 static void
265 add_new_header_file PARAMS ((char *, int));
266
267 static void
268 add_old_header_file PARAMS ((char *, int));
269
270 static void
271 add_this_object_header_file PARAMS ((int));
272
273 /* Free up old header file tables */
274
275 static void
276 free_header_files ()
277 {
278   if (this_object_header_files)
279     {
280       free ((PTR)this_object_header_files);
281       this_object_header_files = NULL;
282     }
283   n_allocated_this_object_header_files = 0;
284 }
285
286 /* Allocate new header file tables */
287
288 static void
289 init_header_files ()
290 {
291   n_allocated_this_object_header_files = 10;
292   this_object_header_files = (int *) xmalloc (10 * sizeof (int));
293 }
294
295 /* Add header file number I for this object file
296    at the next successive FILENUM.  */
297
298 static void
299 add_this_object_header_file (i)
300      int i;
301 {
302   if (n_this_object_header_files == n_allocated_this_object_header_files)
303     {
304       n_allocated_this_object_header_files *= 2;
305       this_object_header_files
306         = (int *) xrealloc ((char *) this_object_header_files,
307                             n_allocated_this_object_header_files * sizeof (int));
308     }
309
310   this_object_header_files[n_this_object_header_files++] = i;
311 }
312
313 /* Add to this file an "old" header file, one already seen in
314    a previous object file.  NAME is the header file's name.
315    INSTANCE is its instance code, to select among multiple
316    symbol tables for the same header file.  */
317
318 static void
319 add_old_header_file (name, instance)
320      char *name;
321      int instance;
322 {
323   register struct header_file *p = HEADER_FILES (current_objfile);
324   register int i;
325
326   for (i = 0; i < N_HEADER_FILES (current_objfile); i++)
327     if (STREQ (p[i].name, name) && instance == p[i].instance)
328       {
329         add_this_object_header_file (i);
330         return;
331       }
332   complain (&repeated_header_complaint, name, symnum);
333 }
334
335 /* Add to this file a "new" header file: definitions for its types follow.
336    NAME is the header file's name.
337    Most often this happens only once for each distinct header file,
338    but not necessarily.  If it happens more than once, INSTANCE has
339    a different value each time, and references to the header file
340    use INSTANCE values to select among them.
341
342    dbx output contains "begin" and "end" markers for each new header file,
343    but at this level we just need to know which files there have been;
344    so we record the file when its "begin" is seen and ignore the "end".  */
345
346 static void
347 add_new_header_file (name, instance)
348      char *name;
349      int instance;
350 {
351   register int i;
352   register struct header_file *hfile;
353
354   /* Make sure there is room for one more header file.  */
355
356   i = N_ALLOCATED_HEADER_FILES (current_objfile);
357
358   if (N_HEADER_FILES (current_objfile) == i)
359     {
360       if (i == 0)
361         {
362           N_ALLOCATED_HEADER_FILES (current_objfile) = 10;
363           HEADER_FILES (current_objfile) = (struct header_file *)
364             xmalloc (10 * sizeof (struct header_file));
365         }
366       else
367         {
368           i *= 2;
369           N_ALLOCATED_HEADER_FILES (current_objfile) = i;
370           HEADER_FILES (current_objfile) = (struct header_file *)
371             xrealloc ((char *) HEADER_FILES (current_objfile),
372                       (i * sizeof (struct header_file)));
373         }
374     }
375
376   /* Create an entry for this header file.  */
377
378   i = N_HEADER_FILES (current_objfile)++;
379   hfile = HEADER_FILES (current_objfile) + i;
380   hfile->name = savestring (name, strlen(name));
381   hfile->instance = instance;
382   hfile->length = 10;
383   hfile->vector
384     = (struct type **) xmalloc (10 * sizeof (struct type *));
385   memset (hfile->vector, 0, 10 * sizeof (struct type *));
386
387   add_this_object_header_file (i);
388 }
389
390 #if 0
391 static struct type **
392 explicit_lookup_type (real_filenum, index)
393      int real_filenum, index;
394 {
395   register struct header_file *f = &HEADER_FILES (current_objfile)[real_filenum];
396
397   if (index >= f->length)
398     {
399       f->length *= 2;
400       f->vector = (struct type **)
401         xrealloc (f->vector, f->length * sizeof (struct type *));
402       memset (&f->vector[f->length / 2],
403              '\0', f->length * sizeof (struct type *) / 2);
404     }
405   return &f->vector[index];
406 }
407 #endif
408 \f
409 static void
410 record_minimal_symbol (name, address, type, objfile)
411      char *name;
412      CORE_ADDR address;
413      int type;
414      struct objfile *objfile;
415 {
416   enum minimal_symbol_type ms_type;
417   int section;
418
419   switch (type)
420     {
421     case N_TEXT | N_EXT:
422       ms_type = mst_text;
423       section = SECT_OFF_TEXT;
424       break;
425     case N_DATA | N_EXT:
426       ms_type = mst_data;
427       section = SECT_OFF_DATA;
428       break;
429     case N_BSS | N_EXT:
430       ms_type = mst_bss;
431       section = SECT_OFF_BSS;
432       break;
433     case N_ABS | N_EXT:
434       ms_type = mst_abs;
435       section = -1;
436       break;
437 #ifdef N_SETV
438     case N_SETV | N_EXT:
439       ms_type = mst_data;
440       section = SECT_OFF_DATA;
441       break;
442     case N_SETV:
443       /* I don't think this type actually exists; since a N_SETV is the result
444          of going over many .o files, it doesn't make sense to have one
445          file local.  */
446       ms_type = mst_file_data;
447       section = SECT_OFF_DATA;
448       break;
449 #endif
450     case N_TEXT:
451     case N_NBTEXT:
452     case N_FN:
453     case N_FN_SEQ:
454       ms_type = mst_file_text;
455       section = SECT_OFF_TEXT;
456       break;
457     case N_DATA:
458       ms_type = mst_file_data;
459
460       /* Check for __DYNAMIC, which is used by Sun shared libraries. 
461          Record it as global even if it's local, not global, so
462          lookup_minimal_symbol can find it.  We don't check symbol_leading_char
463          because for SunOS4 it always is '_'.  */
464       if (name[8] == 'C' && STREQ ("__DYNAMIC", name))
465         ms_type = mst_data;
466
467       /* Same with virtual function tables, both global and static.  */
468       {
469         char *tempstring = name;
470         if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
471           ++tempstring;
472         if (VTBL_PREFIX_P ((tempstring)))
473           ms_type = mst_data;
474       }
475       section = SECT_OFF_DATA;
476       break;
477     case N_BSS:
478       ms_type = mst_file_bss;
479       section = SECT_OFF_BSS;
480       break;
481     default:
482       ms_type = mst_unknown;
483       section = -1;
484       break;
485   }
486
487   if ((ms_type == mst_file_text || ms_type == mst_text)
488       && address < lowest_text_address)
489     lowest_text_address = address;
490
491   prim_record_minimal_symbol_and_info
492     (name, address, ms_type, NULL, section, objfile);
493 }
494 \f
495 /* Scan and build partial symbols for a symbol file.
496    We have been initialized by a call to dbx_symfile_init, which 
497    put all the relevant info into a "struct dbx_symfile_info",
498    hung off the objfile structure.
499
500    SECTION_OFFSETS contains offsets relative to which the symbols in the
501    various sections are (depending where the sections were actually loaded).
502    MAINLINE is true if we are reading the main symbol
503    table (as opposed to a shared lib or dynamically loaded file).  */
504
505 static void
506 dbx_symfile_read (objfile, section_offsets, mainline)
507      struct objfile *objfile;
508      struct section_offsets *section_offsets;
509      int mainline;      /* FIXME comments above */
510 {
511   bfd *sym_bfd;
512   int val;
513   struct cleanup *back_to;
514
515   val = strlen (objfile->name);
516
517   sym_bfd = objfile->obfd;
518
519   /* .o and .nlm files are relocatables with text, data and bss segs based at
520      0.  This flag disables special (Solaris stabs-in-elf only) fixups for
521      symbols with a value of 0.  */
522
523   symfile_relocatable = bfd_get_file_flags (sym_bfd) & HAS_RELOC;
524
525   /* This is true for Solaris (and all other systems which put stabs
526      in sections, hopefully, since it would be silly to do things
527      differently from Solaris), and false for SunOS4 and other a.out
528      file formats.  */
529   block_address_function_relative =
530     ((0 == strncmp (bfd_get_target (sym_bfd), "elf", 3))
531      || (0 == strncmp (bfd_get_target (sym_bfd), "som", 3))
532      || (0 == strncmp (bfd_get_target (sym_bfd), "coff", 4))
533      || (0 == strncmp (bfd_get_target (sym_bfd), "pe", 2))
534      || (0 == strncmp (bfd_get_target (sym_bfd), "nlm", 3)));
535
536   val = bfd_seek (sym_bfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
537   if (val < 0)
538     perror_with_name (objfile->name);
539
540   /* If we are reinitializing, or if we have never loaded syms yet, init */
541   if (mainline
542       || objfile->global_psymbols.size == 0
543       || objfile->static_psymbols.size == 0)
544     init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
545
546   symbol_size = DBX_SYMBOL_SIZE (objfile);
547   symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
548
549   free_pending_blocks ();
550   back_to = make_cleanup (really_free_pendings, 0);
551
552   init_minimal_symbol_collection ();
553   make_cleanup (discard_minimal_symbols, 0);
554
555   /* Now that the symbol table data of the executable file are all in core,
556      process them and define symbols accordingly.  */
557
558   read_dbx_symtab (section_offsets, objfile,
559                    DBX_TEXT_ADDR (objfile),
560                    DBX_TEXT_SIZE (objfile));
561
562   /* Add the dynamic symbols.  */
563
564   read_dbx_dynamic_symtab (section_offsets, objfile);
565
566   /* Install any minimal symbols that have been collected as the current
567      minimal symbols for this objfile. */
568
569   install_minimal_symbols (objfile);
570
571   do_cleanups (back_to);
572 }
573
574 /* Initialize anything that needs initializing when a completely new
575    symbol file is specified (not just adding some symbols from another
576    file, e.g. a shared library).  */
577
578 static void
579 dbx_new_init (ignore)
580      struct objfile *ignore;
581 {
582   stabsread_new_init ();
583   buildsym_new_init ();
584   init_header_files ();
585 }
586
587
588 /* dbx_symfile_init ()
589    is the dbx-specific initialization routine for reading symbols.
590    It is passed a struct objfile which contains, among other things,
591    the BFD for the file whose symbols are being read, and a slot for a pointer
592    to "private data" which we fill with goodies.
593
594    We read the string table into malloc'd space and stash a pointer to it.
595
596    Since BFD doesn't know how to read debug symbols in a format-independent
597    way (and may never do so...), we have to do it ourselves.  We will never
598    be called unless this is an a.out (or very similar) file. 
599    FIXME, there should be a cleaner peephole into the BFD environment here.  */
600
601 #define DBX_STRINGTAB_SIZE_SIZE sizeof(long)   /* FIXME */
602
603 static void
604 dbx_symfile_init (objfile)
605      struct objfile *objfile;
606 {
607   int val;
608   bfd *sym_bfd = objfile->obfd;
609   char *name = bfd_get_filename (sym_bfd);
610   asection *text_sect;
611   unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
612
613   /* Allocate struct to keep track of the symfile */
614   objfile->sym_stab_info = (PTR)
615     xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
616
617   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
618 #define STRING_TABLE_OFFSET     (sym_bfd->origin + obj_str_filepos (sym_bfd))
619 #define SYMBOL_TABLE_OFFSET     (sym_bfd->origin + obj_sym_filepos (sym_bfd))
620
621   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
622
623   DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
624   
625   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
626   if (!text_sect)
627     error ("Can't find .text section in symbol file");
628   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
629   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
630
631   DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
632   DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
633   DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
634
635   /* Read the string table and stash it away in the psymbol_obstack.  It is
636      only needed as long as we need to expand psymbols into full symbols,
637      so when we blow away the psymbol the string table goes away as well.
638      Note that gdb used to use the results of attempting to malloc the
639      string table, based on the size it read, as a form of sanity check
640      for botched byte swapping, on the theory that a byte swapped string
641      table size would be so totally bogus that the malloc would fail.  Now
642      that we put in on the psymbol_obstack, we can't do this since gdb gets
643      a fatal error (out of virtual memory) if the size is bogus.  We can
644      however at least check to see if the size is less than the size of
645      the size field itself, or larger than the size of the entire file.
646      Note that all valid string tables have a size greater than zero, since
647      the bytes used to hold the size are included in the count. */
648
649   if (STRING_TABLE_OFFSET == 0)
650     {
651       /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
652          will never be zero, even when there is no string table.  This
653          would appear to be a bug in bfd. */
654       DBX_STRINGTAB_SIZE (objfile) = 0;
655       DBX_STRINGTAB (objfile) = NULL;
656     }
657   else
658     {
659       val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
660       if (val < 0)
661         perror_with_name (name);
662       
663       memset ((PTR) size_temp, 0, sizeof (size_temp));
664       val = bfd_read ((PTR) size_temp, sizeof (size_temp), 1, sym_bfd);
665       if (val < 0)
666         {
667           perror_with_name (name);
668         }
669       else if (val == 0)
670         {
671           /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
672              EOF if there is no string table, and attempting to read the size
673              from EOF will read zero bytes. */
674           DBX_STRINGTAB_SIZE (objfile) = 0;
675           DBX_STRINGTAB (objfile) = NULL;
676         }
677       else
678         {
679           /* Read some data that would appear to be the string table size.
680              If there really is a string table, then it is probably the right
681              size.  Byteswap if necessary and validate the size.  Note that
682              the minimum is DBX_STRINGTAB_SIZE_SIZE.  If we just read some
683              random data that happened to be at STRING_TABLE_OFFSET, because
684              bfd can't tell us there is no string table, the sanity checks may
685              or may not catch this. */
686           DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
687           
688           if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
689               || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
690             error ("ridiculous string table size (%d bytes).",
691                    DBX_STRINGTAB_SIZE (objfile));
692           
693           DBX_STRINGTAB (objfile) =
694             (char *) obstack_alloc (&objfile -> psymbol_obstack,
695                                     DBX_STRINGTAB_SIZE (objfile));
696           OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile));
697           
698           /* Now read in the string table in one big gulp.  */
699           
700           val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
701           if (val < 0)
702             perror_with_name (name);
703           val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
704                           sym_bfd);
705           if (val != DBX_STRINGTAB_SIZE (objfile))
706             perror_with_name (name);
707         }
708     }
709 }
710
711 /* Perform any local cleanups required when we are done with a particular
712    objfile.  I.E, we are in the process of discarding all symbol information
713    for an objfile, freeing up all memory held for it, and unlinking the
714    objfile struct from the global list of known objfiles. */
715
716 static void
717 dbx_symfile_finish (objfile)
718      struct objfile *objfile;
719 {
720   if (objfile->sym_stab_info != NULL)
721     {
722       if (HEADER_FILES (objfile) != NULL)
723         {
724           register int i = N_HEADER_FILES (objfile);
725           register struct header_file *hfiles = HEADER_FILES (objfile);
726
727           while (--i >= 0)
728             {
729               free (hfiles [i].name);
730             }
731           free ((PTR) hfiles);
732         }
733       mfree (objfile -> md, objfile->sym_stab_info);
734     }
735   free_header_files ();
736 }
737
738 \f
739 /* Buffer for reading the symbol table entries.  */
740 static struct external_nlist symbuf[4096];
741 static int symbuf_idx;
742 static int symbuf_end;
743
744 /* cont_elem is used for continuing information in cfront.
745    It saves information about which types need to be fixed up and 
746    completed after all the stabs are read.  */
747 struct cont_elem 
748   {
749     /* sym and stabsstring for continuing information in cfront */
750     struct symbol * sym;
751     char * stabs;
752     /* state dependancies (statics that must be preserved) */
753     int sym_idx;
754     int sym_end;
755     int symnum;
756     /* other state dependancies include:
757        (assumption is that these will not change since process_now FIXME!!)
758         stringtab_global
759         n_stabs
760         objfile
761         symfile_bfd */
762 };
763 static struct cont_elem cont_list[100];
764 static int cont_count = 0;
765
766 void 
767 process_later(sym,p)
768   struct symbol * sym;
769   char * p;
770 {
771   /* save state so we can process these stabs later */
772   cont_list[cont_count].sym_idx = symbuf_idx;
773   cont_list[cont_count].sym_end = symbuf_end;
774   cont_list[cont_count].symnum = symnum;
775   cont_list[cont_count].sym = sym;
776   cont_list[cont_count].stabs = p;
777   cont_count++;
778 }
779
780 static void 
781 process_now(objfile) 
782   struct objfile * objfile;
783 {
784   int i;
785   /* save original state */
786   int save_symbuf_idx = symbuf_idx;
787   int save_symbuf_end = symbuf_end;
788   int save_symnum = symnum;
789   for (i=0; i<cont_count; i++) 
790     {
791       /* set state as if we were parsing stabs strings 
792          for this symbol */
793       symbuf_idx = cont_list[i].sym_idx;   /* statics used by gdb */
794       symbuf_end = cont_list[i].sym_end;  
795       symnum = cont_list[i].symnum;  
796       resolve_cfront_continuation(objfile,cont_list[i].sym,cont_list[i].stabs);
797     }
798   /* restore original state */
799   symbuf_idx = save_symbuf_idx;
800   symbuf_end = save_symbuf_end;
801   symnum = save_symnum;
802   cont_count=0;  /* reset for next run */
803 }
804
805
806 /* Name of last function encountered.  Used in Solaris to approximate
807    object file boundaries.  */
808 static char *last_function_name;
809
810 /* The address in memory of the string table of the object file we are
811    reading (which might not be the "main" object file, but might be a
812    shared library or some other dynamically loaded thing).  This is
813    set by read_dbx_symtab when building psymtabs, and by
814    read_ofile_symtab when building symtabs, and is used only by
815    next_symbol_text.  FIXME: If that is true, we don't need it when
816    building psymtabs, right?  */
817 static char *stringtab_global;
818
819 /* These variables are used to control fill_symbuf when the stabs
820    symbols are not contiguous (as may be the case when a COFF file is
821    linked using --split-by-reloc).  */
822 static struct stab_section_list *symbuf_sections;
823 static unsigned int symbuf_left;
824 static unsigned int symbuf_read;
825
826 /* Refill the symbol table input buffer
827    and set the variables that control fetching entries from it.
828    Reports an error if no data available.
829    This function can read past the end of the symbol table
830    (into the string table) but this does no harm.  */
831
832 static void
833 fill_symbuf (sym_bfd)
834      bfd *sym_bfd;
835 {
836   unsigned int count;
837   int nbytes;
838
839   if (symbuf_sections == NULL)
840     count = sizeof (symbuf);
841   else
842     {
843       if (symbuf_left <= 0)
844         {
845           file_ptr filepos = symbuf_sections->section->filepos;
846           if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0)
847             perror_with_name (bfd_get_filename (sym_bfd));
848           symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section);
849           symbol_table_offset = filepos - symbuf_read;
850           symbuf_sections = symbuf_sections->next;
851         }
852
853       count = symbuf_left;
854       if (count > sizeof (symbuf))
855         count = sizeof (symbuf);
856     }
857
858   nbytes = bfd_read ((PTR)symbuf, count, 1, sym_bfd);
859   if (nbytes < 0)
860     perror_with_name (bfd_get_filename (sym_bfd));
861   else if (nbytes == 0)
862     error ("Premature end of file reading symbol table");
863   symbuf_end = nbytes / symbol_size;
864   symbuf_idx = 0;
865   symbuf_left -= nbytes;
866   symbuf_read += nbytes;
867 }
868
869 #define SWAP_SYMBOL(symp, abfd) \
870   { \
871     (symp)->n_strx = bfd_h_get_32(abfd,                 \
872                                 (unsigned char *)&(symp)->n_strx);      \
873     (symp)->n_desc = bfd_h_get_16 (abfd,                        \
874                                 (unsigned char *)&(symp)->n_desc);      \
875     (symp)->n_value = bfd_h_get_32 (abfd,                       \
876                                 (unsigned char *)&(symp)->n_value);     \
877   }
878
879 #define INTERNALIZE_SYMBOL(intern, extern, abfd)                        \
880   {                                                                     \
881     (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);             \
882     (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);            \
883     (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);            \
884     (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);          \
885   }
886
887 /* Invariant: The symbol pointed to by symbuf_idx is the first one
888    that hasn't been swapped.  Swap the symbol at the same time
889    that symbuf_idx is incremented.  */
890
891 /* dbx allows the text of a symbol name to be continued into the
892    next symbol name!  When such a continuation is encountered
893    (a \ at the end of the text of a name)
894    call this function to get the continuation.  */
895
896 static char *
897 dbx_next_symbol_text (objfile)
898      struct objfile *objfile;
899 {
900   struct internal_nlist nlist;
901
902   if (symbuf_idx == symbuf_end)
903     fill_symbuf (symfile_bfd);
904
905   symnum++;
906   INTERNALIZE_SYMBOL(nlist, &symbuf[symbuf_idx], symfile_bfd);
907   OBJSTAT (objfile, n_stabs++);
908
909   symbuf_idx++;
910
911   return nlist.n_strx + stringtab_global + file_string_table_offset;
912 }
913 \f
914 /* Initialize the list of bincls to contain none and have some
915    allocated.  */
916
917 static void
918 init_bincl_list (number, objfile)
919      int number;
920      struct objfile *objfile;
921 {
922   bincls_allocated = number;
923   next_bincl = bincl_list = (struct header_file_location *)
924     xmmalloc (objfile -> md, bincls_allocated * sizeof(struct header_file_location));
925 }
926
927 /* Add a bincl to the list.  */
928
929 static void
930 add_bincl_to_list (pst, name, instance)
931      struct partial_symtab *pst;
932      char *name;
933      int instance;
934 {
935   if (next_bincl >= bincl_list + bincls_allocated)
936     {
937       int offset = next_bincl - bincl_list;
938       bincls_allocated *= 2;
939       bincl_list = (struct header_file_location *)
940         xmrealloc (pst->objfile->md, (char *)bincl_list,
941                   bincls_allocated * sizeof (struct header_file_location));
942       next_bincl = bincl_list + offset;
943     }
944   next_bincl->pst = pst;
945   next_bincl->instance = instance;
946   next_bincl++->name = name;
947 }
948
949 /* Given a name, value pair, find the corresponding
950    bincl in the list.  Return the partial symtab associated
951    with that header_file_location.  */
952
953 static struct partial_symtab *
954 find_corresponding_bincl_psymtab (name, instance)
955      char *name;
956      int instance;
957 {
958   struct header_file_location *bincl;
959
960   for (bincl = bincl_list; bincl < next_bincl; bincl++)
961     if (bincl->instance == instance
962         && STREQ (name, bincl->name))
963       return bincl->pst;
964
965   complain (&repeated_header_complaint, name, symnum);
966   return (struct partial_symtab *) 0;
967 }
968
969 /* Free the storage allocated for the bincl list.  */
970
971 static void
972 free_bincl_list (objfile)
973      struct objfile *objfile;
974 {
975   mfree (objfile -> md, (PTR)bincl_list);
976   bincls_allocated = 0;
977 }
978
979 /* Scan a SunOs dynamic symbol table for symbols of interest and
980    add them to the minimal symbol table.  */
981
982 static void
983 read_dbx_dynamic_symtab (section_offsets, objfile)
984      struct section_offsets *section_offsets;
985      struct objfile *objfile;
986 {
987   bfd *abfd = objfile->obfd;
988   struct cleanup *back_to;
989   int counter;
990   long dynsym_size;
991   long dynsym_count;
992   asymbol **dynsyms;
993   asymbol **symptr;
994   arelent **relptr;
995   long dynrel_size;
996   long dynrel_count;
997   arelent **dynrels;
998   CORE_ADDR sym_value;
999   char *name;
1000
1001   /* Check that the symbol file has dynamic symbols that we know about.
1002      bfd_arch_unknown can happen if we are reading a sun3 symbol file
1003      on a sun4 host (and vice versa) and bfd is not configured
1004      --with-target=all.  This would trigger an assertion in bfd/sunos.c,
1005      so we ignore the dynamic symbols in this case.  */
1006   if (bfd_get_flavour (abfd) != bfd_target_aout_flavour
1007       || (bfd_get_file_flags (abfd) & DYNAMIC) == 0
1008       || bfd_get_arch (abfd) == bfd_arch_unknown)
1009     return;
1010
1011   dynsym_size = bfd_get_dynamic_symtab_upper_bound (abfd);
1012   if (dynsym_size < 0)
1013     return;
1014
1015   dynsyms = (asymbol **) xmalloc (dynsym_size);
1016   back_to = make_cleanup (free, dynsyms);
1017
1018   dynsym_count = bfd_canonicalize_dynamic_symtab (abfd, dynsyms);
1019   if (dynsym_count < 0)
1020     {
1021       do_cleanups (back_to);
1022       return;
1023     }
1024
1025   /* Enter dynamic symbols into the minimal symbol table
1026      if this is a stripped executable.  */
1027   if (bfd_get_symcount (abfd) <= 0)
1028     {
1029       symptr = dynsyms;
1030       for (counter = 0; counter < dynsym_count; counter++, symptr++)
1031         {
1032           asymbol *sym = *symptr;
1033           asection *sec;
1034           int type;
1035
1036           sec = bfd_get_section (sym);
1037
1038           /* BFD symbols are section relative.  */
1039           sym_value = sym->value + sec->vma;
1040
1041           if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
1042             {
1043               sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1044               type = N_TEXT;
1045             }
1046           else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
1047             {
1048               sym_value += ANOFFSET (section_offsets, SECT_OFF_DATA);
1049               type = N_DATA;
1050             }
1051           else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
1052             {
1053               sym_value += ANOFFSET (section_offsets, SECT_OFF_BSS);
1054               type = N_BSS;
1055             }
1056           else
1057             continue;
1058
1059           if (sym->flags & BSF_GLOBAL)
1060             type |= N_EXT;
1061
1062           record_minimal_symbol ((char *) bfd_asymbol_name (sym), sym_value,
1063                                  type, objfile);
1064         }
1065     }
1066
1067   /* Symbols from shared libraries have a dynamic relocation entry
1068      that points to the associated slot in the procedure linkage table.
1069      We make a mininal symbol table entry with type mst_solib_trampoline
1070      at the address in the procedure linkage table.  */
1071   dynrel_size = bfd_get_dynamic_reloc_upper_bound (abfd);
1072   if (dynrel_size < 0)
1073     {
1074       do_cleanups (back_to);
1075       return;
1076     }
1077   
1078   dynrels = (arelent **) xmalloc (dynrel_size);
1079   make_cleanup (free, dynrels);
1080
1081   dynrel_count = bfd_canonicalize_dynamic_reloc (abfd, dynrels, dynsyms);
1082   if (dynrel_count < 0)
1083     {
1084       do_cleanups (back_to);
1085       return;
1086     }
1087
1088   for (counter = 0, relptr = dynrels;
1089        counter < dynrel_count;
1090        counter++, relptr++)
1091     {
1092       arelent *rel = *relptr;
1093       CORE_ADDR address =
1094         rel->address + ANOFFSET (section_offsets, SECT_OFF_DATA);
1095
1096       switch (bfd_get_arch (abfd))
1097         {
1098         case bfd_arch_sparc:
1099           if (rel->howto->type != RELOC_JMP_SLOT)
1100             continue;
1101           break;
1102         case bfd_arch_m68k:
1103           /* `16' is the type BFD produces for a jump table relocation.  */
1104           if (rel->howto->type != 16)
1105             continue;
1106
1107           /* Adjust address in the jump table to point to
1108              the start of the bsr instruction.  */
1109           address -= 2;
1110           break;
1111         default:
1112           continue;
1113         }
1114
1115       name = (char *) bfd_asymbol_name (*rel->sym_ptr_ptr);
1116       prim_record_minimal_symbol (name, address, mst_solib_trampoline,
1117                                   objfile);
1118     }
1119
1120   do_cleanups (back_to);
1121 }
1122
1123 /* Given pointers to an a.out symbol table in core containing dbx
1124    style data, setup partial_symtab's describing each source file for
1125    which debugging information is available.
1126    SYMFILE_NAME is the name of the file we are reading from
1127    and SECTION_OFFSETS is the set of offsets for the various sections
1128    of the file (a set of zeros if the mainline program).  */
1129
1130 static void
1131 read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
1132      struct section_offsets *section_offsets;
1133      struct objfile *objfile;
1134      CORE_ADDR text_addr;
1135      int text_size;
1136 {
1137   register struct external_nlist *bufp = 0;     /* =0 avoids gcc -Wall glitch */
1138   struct internal_nlist nlist;
1139
1140   register char *namestring;
1141   int nsl;
1142   int past_first_source_file = 0;
1143   CORE_ADDR last_o_file_start = 0;
1144   CORE_ADDR last_function_start = 0;
1145   struct cleanup *back_to;
1146   bfd *abfd;
1147   int textlow_not_set;
1148
1149   /* Current partial symtab */
1150   struct partial_symtab *pst;
1151
1152   /* List of current psymtab's include files */
1153   char **psymtab_include_list;
1154   int includes_allocated;
1155   int includes_used;
1156
1157   /* Index within current psymtab dependency list */
1158   struct partial_symtab **dependency_list;
1159   int dependencies_used, dependencies_allocated;
1160
1161   /* FIXME.  We probably want to change stringtab_global rather than add this
1162      while processing every symbol entry.  FIXME.  */
1163   file_string_table_offset = 0;
1164   next_file_string_table_offset = 0;
1165
1166   stringtab_global = DBX_STRINGTAB (objfile);
1167   
1168   pst = (struct partial_symtab *) 0;
1169
1170   includes_allocated = 30;
1171   includes_used = 0;
1172   psymtab_include_list = (char **) alloca (includes_allocated *
1173                                            sizeof (char *));
1174
1175   dependencies_allocated = 30;
1176   dependencies_used = 0;
1177   dependency_list =
1178     (struct partial_symtab **) alloca (dependencies_allocated *
1179                                        sizeof (struct partial_symtab *));
1180
1181   /* Init bincl list */
1182   init_bincl_list (20, objfile);
1183   back_to = make_cleanup (free_bincl_list, objfile);
1184
1185   last_source_file = NULL;
1186
1187   lowest_text_address = (CORE_ADDR)-1;
1188
1189   symfile_bfd = objfile->obfd;  /* For next_text_symbol */
1190   abfd = objfile->obfd;
1191   symbuf_end = symbuf_idx = 0;
1192   next_symbol_text_func = dbx_next_symbol_text;
1193   textlow_not_set = 1;
1194
1195   for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
1196     {
1197       /* Get the symbol for this run and pull out some info */
1198       QUIT;     /* allow this to be interruptable */
1199       if (symbuf_idx == symbuf_end)
1200         fill_symbuf (abfd);
1201       bufp = &symbuf[symbuf_idx++];
1202
1203       /*
1204        * Special case to speed up readin.
1205        */
1206       if (bfd_h_get_8 (abfd, bufp->e_type) == N_SLINE)
1207         continue;
1208
1209       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1210       OBJSTAT (objfile, n_stabs++);
1211
1212       /* Ok.  There is a lot of code duplicated in the rest of this
1213          switch statement (for efficiency reasons).  Since I don't
1214          like duplicating code, I will do my penance here, and
1215          describe the code which is duplicated:
1216
1217          *) The assignment to namestring.
1218          *) The call to strchr.
1219          *) The addition of a partial symbol the the two partial
1220             symbol lists.  This last is a large section of code, so
1221             I've imbedded it in the following macro.
1222          */
1223       
1224 /* Set namestring based on nlist.  If the string table index is invalid, 
1225    give a fake name, and print a single error message per symbol file read,
1226    rather than abort the symbol reading or flood the user with messages.  */
1227
1228 /*FIXME: Too many adds and indirections in here for the inner loop.  */
1229 #define SET_NAMESTRING()\
1230   if (((unsigned)CUR_SYMBOL_STRX + file_string_table_offset) >=         \
1231       DBX_STRINGTAB_SIZE (objfile)) {                                   \
1232     complain (&string_table_offset_complaint, symnum);                  \
1233     namestring = "<bad string table offset>";                           \
1234   } else                                                                \
1235     namestring = CUR_SYMBOL_STRX + file_string_table_offset +           \
1236                  DBX_STRINGTAB (objfile)
1237
1238 #define CUR_SYMBOL_TYPE nlist.n_type
1239 #define CUR_SYMBOL_VALUE nlist.n_value
1240 #define CUR_SYMBOL_STRX nlist.n_strx
1241 #define DBXREAD_ONLY
1242 #define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms)\
1243   start_psymtab(ofile, secoff, fname, low, symoff, global_syms, static_syms)
1244 #define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)\
1245   end_psymtab(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)
1246
1247 #include "partial-stab.h"
1248     }
1249
1250   /* If there's stuff to be cleaned up, clean it up.  */
1251   if (DBX_SYMCOUNT (objfile) > 0                        /* We have some syms */
1252 /*FIXME, does this have a bug at start address 0? */
1253       && last_o_file_start
1254       && objfile -> ei.entry_point < nlist.n_value
1255       && objfile -> ei.entry_point >= last_o_file_start)
1256     {
1257       objfile -> ei.entry_file_lowpc = last_o_file_start;
1258       objfile -> ei.entry_file_highpc = nlist.n_value;
1259     }
1260
1261   if (pst)
1262     {
1263       end_psymtab (pst, psymtab_include_list, includes_used,
1264                    symnum * symbol_size,
1265                    (lowest_text_address == (CORE_ADDR)-1
1266                     ? (text_addr + section_offsets->offsets[SECT_OFF_TEXT])
1267                     : lowest_text_address)
1268                    + text_size,
1269                    dependency_list, dependencies_used, textlow_not_set);
1270     }
1271
1272   do_cleanups (back_to);
1273 }
1274
1275 /* Allocate and partially fill a partial symtab.  It will be
1276    completely filled at the end of the symbol list.
1277
1278    SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
1279    is the address relative to which its symbols are (incremental) or 0
1280    (normal). */
1281
1282
1283 struct partial_symtab *
1284 start_psymtab (objfile, section_offsets,
1285                filename, textlow, ldsymoff, global_syms, static_syms)
1286      struct objfile *objfile;
1287      struct section_offsets *section_offsets;
1288      char *filename;
1289      CORE_ADDR textlow;
1290      int ldsymoff;
1291      struct partial_symbol **global_syms;
1292      struct partial_symbol **static_syms;
1293 {
1294   struct partial_symtab *result =
1295       start_psymtab_common(objfile, section_offsets,
1296                            filename, textlow, global_syms, static_syms);
1297
1298   result->read_symtab_private = (char *)
1299     obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc));
1300   LDSYMOFF(result) = ldsymoff;
1301   result->read_symtab = dbx_psymtab_to_symtab;
1302   SYMBOL_SIZE(result) = symbol_size;
1303   SYMBOL_OFFSET(result) = symbol_table_offset;
1304   STRING_OFFSET(result) = string_table_offset;
1305   FILE_STRING_OFFSET(result) = file_string_table_offset;
1306
1307   /* If we're handling an ELF file, drag some section-relocation info
1308      for this source file out of the ELF symbol table, to compensate for
1309      Sun brain death.  This replaces the section_offsets in this psymtab,
1310      if successful.  */
1311   elfstab_offset_sections (objfile, result);
1312
1313   /* Deduce the source language from the filename for this psymtab. */
1314   psymtab_language = deduce_language_from_filename (filename);
1315
1316   return result;
1317 }
1318
1319 /* Close off the current usage of PST.  
1320    Returns PST or NULL if the partial symtab was empty and thrown away.
1321
1322    FIXME:  List variables and peculiarities of same.  */
1323
1324 struct partial_symtab *
1325 end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
1326              capping_text, dependency_list, number_dependencies, textlow_not_set)
1327      struct partial_symtab *pst;
1328      char **include_list;
1329      int num_includes;
1330      int capping_symbol_offset;
1331      CORE_ADDR capping_text;
1332      struct partial_symtab **dependency_list;
1333      int number_dependencies;
1334      int textlow_not_set;
1335 {
1336   int i;
1337   struct objfile *objfile = pst -> objfile;
1338
1339   if (capping_symbol_offset != -1)
1340     LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
1341   pst->texthigh = capping_text;
1342
1343 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1344   /* Under Solaris, the N_SO symbols always have a value of 0,
1345      instead of the usual address of the .o file.  Therefore,
1346      we have to do some tricks to fill in texthigh and textlow.
1347      The first trick is in partial-stab.h: if we see a static
1348      or global function, and the textlow for the current pst
1349      is not set (ie: textlow_not_set), then we use that function's
1350      address for the textlow of the pst.  */
1351
1352   /* Now, to fill in texthigh, we remember the last function seen
1353      in the .o file (also in partial-stab.h).  Also, there's a hack in
1354      bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
1355      to here via the misc_info field.  Therefore, we can fill in
1356      a reliable texthigh by taking the address plus size of the
1357      last function in the file.  */
1358
1359   if (pst->texthigh == 0 && last_function_name)
1360     {
1361       char *p;
1362       int n;
1363       struct minimal_symbol *minsym;
1364
1365       p = strchr (last_function_name, ':');
1366       if (p == NULL)
1367         p = last_function_name;
1368       n = p - last_function_name;
1369       p = alloca (n + 1);
1370       strncpy (p, last_function_name, n);
1371       p[n] = 0;
1372     
1373       minsym = lookup_minimal_symbol (p, pst->filename, objfile);
1374
1375       if (minsym)
1376         pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym)
1377           + (long) MSYMBOL_INFO (minsym);
1378
1379       last_function_name = NULL;
1380     }
1381
1382   /* this test will be true if the last .o file is only data */
1383   if (textlow_not_set)
1384     pst->textlow = pst->texthigh;
1385   else
1386     {
1387       struct partial_symtab *p1;
1388
1389       /* If we know our own starting text address, then walk through all other
1390          psymtabs for this objfile, and if any didn't know their ending text
1391          address, set it to our starting address.  Take care to not set our
1392          own ending address to our starting address, nor to set addresses on
1393          `dependency' files that have both textlow and texthigh zero.  */
1394
1395       ALL_OBJFILE_PSYMTABS (objfile, p1)
1396         {
1397           if (p1->texthigh == 0  && p1->textlow != 0 && p1 != pst)
1398             {
1399               p1->texthigh = pst->textlow;
1400               /* if this file has only data, then make textlow match texthigh */
1401               if (p1->textlow == 0)
1402                 p1->textlow = p1->texthigh;
1403             }
1404         }
1405     }
1406
1407   /* End of kludge for patching Solaris textlow and texthigh.  */
1408 #endif /* SOFUN_ADDRESS_MAYBE_MISSING.  */
1409
1410   pst->n_global_syms =
1411     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1412   pst->n_static_syms =
1413     objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1414
1415   pst->number_of_dependencies = number_dependencies;
1416   if (number_dependencies)
1417     {
1418       pst->dependencies = (struct partial_symtab **)
1419         obstack_alloc (&objfile->psymbol_obstack,
1420                        number_dependencies * sizeof (struct partial_symtab *));
1421       memcpy (pst->dependencies, dependency_list,
1422              number_dependencies * sizeof (struct partial_symtab *));
1423     }
1424   else
1425     pst->dependencies = 0;
1426
1427   for (i = 0; i < num_includes; i++)
1428     {
1429       struct partial_symtab *subpst =
1430         allocate_psymtab (include_list[i], objfile);
1431
1432       subpst->section_offsets = pst->section_offsets;
1433       subpst->read_symtab_private =
1434           (char *) obstack_alloc (&objfile->psymbol_obstack,
1435                                   sizeof (struct symloc));
1436       LDSYMOFF(subpst) =
1437         LDSYMLEN(subpst) =
1438           subpst->textlow =
1439             subpst->texthigh = 0;
1440
1441       /* We could save slight bits of space by only making one of these,
1442          shared by the entire set of include files.  FIXME-someday.  */
1443       subpst->dependencies = (struct partial_symtab **)
1444         obstack_alloc (&objfile->psymbol_obstack,
1445                        sizeof (struct partial_symtab *));
1446       subpst->dependencies[0] = pst;
1447       subpst->number_of_dependencies = 1;
1448
1449       subpst->globals_offset =
1450         subpst->n_global_syms =
1451           subpst->statics_offset =
1452             subpst->n_static_syms = 0;
1453
1454       subpst->readin = 0;
1455       subpst->symtab = 0;
1456       subpst->read_symtab = pst->read_symtab;
1457     }
1458
1459   sort_pst_symbols (pst);
1460
1461   /* If there is already a psymtab or symtab for a file of this name, remove it.
1462      (If there is a symtab, more drastic things also happen.)
1463      This happens in VxWorks.  */
1464   free_named_symtabs (pst->filename);
1465
1466   if (num_includes == 0
1467       && number_dependencies == 0
1468       && pst->n_global_syms == 0
1469       && pst->n_static_syms == 0)
1470     {
1471       /* Throw away this psymtab, it's empty.  We can't deallocate it, since
1472          it is on the obstack, but we can forget to chain it on the list.  */
1473       /* Empty psymtabs happen as a result of header files which don't have
1474          any symbols in them.  There can be a lot of them.  But this check
1475          is wrong, in that a psymtab with N_SLINE entries but nothing else
1476          is not empty, but we don't realize that.  Fixing that without slowing
1477          things down might be tricky.  */
1478       struct partial_symtab *prev_pst;
1479
1480       /* First, snip it out of the psymtab chain */
1481
1482       if (pst->objfile->psymtabs == pst)
1483         pst->objfile->psymtabs = pst->next;
1484       else
1485         for (prev_pst = pst->objfile->psymtabs; prev_pst; prev_pst = pst->next)
1486           if (prev_pst->next == pst)
1487             prev_pst->next = pst->next;
1488
1489       /* Next, put it on a free list for recycling */
1490
1491       pst->next = pst->objfile->free_psymtabs;
1492       pst->objfile->free_psymtabs = pst;
1493
1494       /* Indicate that psymtab was thrown away.  */
1495       pst = (struct partial_symtab *)NULL;
1496     }
1497   return pst;
1498 }
1499 \f
1500 static void
1501 dbx_psymtab_to_symtab_1 (pst)
1502      struct partial_symtab *pst;
1503 {
1504   struct cleanup *old_chain;
1505   int i;
1506   
1507   if (!pst)
1508     return;
1509
1510   if (pst->readin)
1511     {
1512       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1513                pst->filename);
1514       return;
1515     }
1516
1517   /* Read in all partial symtabs on which this one is dependent */
1518   for (i = 0; i < pst->number_of_dependencies; i++)
1519     if (!pst->dependencies[i]->readin)
1520       {
1521         /* Inform about additional files that need to be read in.  */
1522         if (info_verbose)
1523           {
1524             fputs_filtered (" ", gdb_stdout);
1525             wrap_here ("");
1526             fputs_filtered ("and ", gdb_stdout);
1527             wrap_here ("");
1528             printf_filtered ("%s...", pst->dependencies[i]->filename);
1529             wrap_here ("");             /* Flush output */
1530             gdb_flush (gdb_stdout);
1531           }
1532         dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
1533       }
1534
1535   if (LDSYMLEN(pst))            /* Otherwise it's a dummy */
1536     {
1537       /* Init stuff necessary for reading in symbols */
1538       stabsread_init ();
1539       buildsym_init ();
1540       old_chain = make_cleanup (really_free_pendings, 0);
1541       file_string_table_offset = FILE_STRING_OFFSET (pst);
1542       symbol_size = SYMBOL_SIZE (pst);
1543
1544       /* Read in this file's symbols */
1545       bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
1546       read_ofile_symtab (pst);
1547       sort_symtab_syms (pst->symtab);
1548
1549       do_cleanups (old_chain);
1550     }
1551
1552   pst->readin = 1;
1553 }
1554
1555 /* Read in all of the symbols for a given psymtab for real.
1556    Be verbose about it if the user wants that.  */
1557
1558 static void
1559 dbx_psymtab_to_symtab (pst)
1560      struct partial_symtab *pst;
1561 {
1562   bfd *sym_bfd;
1563
1564   if (!pst)
1565     return;
1566
1567   if (pst->readin)
1568     {
1569       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1570                pst->filename);
1571       return;
1572     }
1573
1574   if (LDSYMLEN(pst) || pst->number_of_dependencies)
1575     {
1576       /* Print the message now, before reading the string table,
1577          to avoid disconcerting pauses.  */
1578       if (info_verbose)
1579         {
1580           printf_filtered ("Reading in symbols for %s...", pst->filename);
1581           gdb_flush (gdb_stdout);
1582         }
1583
1584       sym_bfd = pst->objfile->obfd;
1585
1586       next_symbol_text_func = dbx_next_symbol_text;
1587
1588       dbx_psymtab_to_symtab_1 (pst);
1589
1590       /* Match with global symbols.  This only needs to be done once,
1591          after all of the symtabs and dependencies have been read in.   */
1592       scan_file_globals (pst->objfile);
1593
1594       /* Finish up the debug error message.  */
1595       if (info_verbose)
1596         printf_filtered ("done.\n");
1597     }
1598 }
1599
1600 /* Read in a defined section of a specific object file's symbols. */
1601   
1602 static void
1603 read_ofile_symtab (pst)
1604      struct partial_symtab *pst;
1605 {
1606   register char *namestring;
1607   register struct external_nlist *bufp;
1608   struct internal_nlist nlist;
1609   unsigned char type;
1610   unsigned max_symnum;
1611   register bfd *abfd;
1612   struct objfile *objfile;
1613   int sym_offset;               /* Offset to start of symbols to read */
1614   int sym_size;                 /* Size of symbols to read */
1615   CORE_ADDR text_offset;        /* Start of text segment for symbols */
1616   int text_size;                /* Size of text segment for symbols */
1617   struct section_offsets *section_offsets;
1618
1619   objfile = pst->objfile;
1620   sym_offset = LDSYMOFF(pst);
1621   sym_size = LDSYMLEN(pst);
1622   text_offset = pst->textlow;
1623   text_size = pst->texthigh - pst->textlow;
1624   section_offsets = pst->section_offsets;
1625
1626   current_objfile = objfile;
1627   subfile_stack = NULL;
1628
1629   stringtab_global = DBX_STRINGTAB (objfile);
1630   last_source_file = NULL;
1631
1632   abfd = objfile->obfd;
1633   symfile_bfd = objfile->obfd;  /* Implicit param to next_text_symbol */
1634   symbuf_end = symbuf_idx = 0;
1635
1636   /* It is necessary to actually read one symbol *before* the start
1637      of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
1638      occurs before the N_SO symbol.
1639
1640      Detecting this in read_dbx_symtab
1641      would slow down initial readin, so we look for it here instead.  */
1642   if (!processing_acc_compilation && sym_offset >= (int)symbol_size)
1643     {
1644       bfd_seek (symfile_bfd, sym_offset - symbol_size, SEEK_CUR);
1645       fill_symbuf (abfd);
1646       bufp = &symbuf[symbuf_idx++];
1647       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1648       OBJSTAT (objfile, n_stabs++);
1649
1650       SET_NAMESTRING ();
1651
1652       processing_gcc_compilation = 0;
1653       if (nlist.n_type == N_TEXT)
1654         {
1655           const char *tempstring = namestring;
1656
1657           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1658             processing_gcc_compilation = 1;
1659           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1660             processing_gcc_compilation = 2;
1661           if (tempstring[0] == bfd_get_symbol_leading_char (symfile_bfd))
1662             ++tempstring;
1663           if (STREQN (tempstring, "__gnu_compiled", 14))
1664             processing_gcc_compilation = 2;
1665         }
1666
1667       /* Try to select a C++ demangling based on the compilation unit
1668          producer. */
1669
1670       if (processing_gcc_compilation)
1671         {
1672           if (AUTO_DEMANGLING)
1673             {
1674               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1675             }
1676         }
1677     }
1678   else
1679     {
1680       /* The N_SO starting this symtab is the first symbol, so we
1681          better not check the symbol before it.  I'm not this can
1682          happen, but it doesn't hurt to check for it.  */
1683       bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
1684       processing_gcc_compilation = 0;
1685     }
1686
1687   if (symbuf_idx == symbuf_end)
1688     fill_symbuf (abfd);
1689   bufp = &symbuf[symbuf_idx];
1690   if (bfd_h_get_8 (abfd, bufp->e_type) != N_SO)
1691     error("First symbol in segment of executable not a source symbol");
1692
1693   max_symnum = sym_size / symbol_size;
1694
1695   for (symnum = 0;
1696        symnum < max_symnum;
1697        symnum++)
1698     {
1699       QUIT;                     /* Allow this to be interruptable */
1700       if (symbuf_idx == symbuf_end)
1701         fill_symbuf(abfd);
1702       bufp = &symbuf[symbuf_idx++];
1703       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1704       OBJSTAT (objfile, n_stabs++);
1705
1706       type = bfd_h_get_8 (abfd, bufp->e_type);
1707
1708       SET_NAMESTRING ();
1709
1710       if (type & N_STAB) {
1711           process_one_symbol (type, nlist.n_desc, nlist.n_value,
1712                               namestring, section_offsets, objfile);
1713       }
1714       /* We skip checking for a new .o or -l file; that should never
1715          happen in this routine. */
1716       else if (type == N_TEXT)
1717         {
1718           /* I don't think this code will ever be executed, because
1719              the GCC_COMPILED_FLAG_SYMBOL usually is right before
1720              the N_SO symbol which starts this source file.
1721              However, there is no reason not to accept
1722              the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
1723
1724           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1725             processing_gcc_compilation = 1;
1726           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1727             processing_gcc_compilation = 2;
1728
1729           if (AUTO_DEMANGLING)
1730             {
1731               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1732             }
1733         }
1734       else if (type & N_EXT || type == (unsigned char)N_TEXT
1735                || type == (unsigned char)N_NBTEXT
1736                ) {
1737           /* Global symbol: see if we came across a dbx defintion for
1738              a corresponding symbol.  If so, store the value.  Remove
1739              syms from the chain when their values are stored, but
1740              search the whole chain, as there may be several syms from
1741              different files with the same name. */
1742           /* This is probably not true.  Since the files will be read
1743              in one at a time, each reference to a global symbol will
1744              be satisfied in each file as it appears. So we skip this
1745              section. */
1746           ;
1747         }
1748     }
1749
1750   current_objfile = NULL;
1751
1752   /* In a Solaris elf file, this variable, which comes from the
1753      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
1754      which comes from pst->textlow is correct. */
1755   if (last_source_start_addr == 0)
1756     last_source_start_addr = text_offset;
1757
1758   /* In reordered executables last_source_start_addr may not be the
1759      lower bound for this symtab, instead use text_offset which comes
1760      from pst->textlow which is correct.  */
1761   if (last_source_start_addr > text_offset)
1762     last_source_start_addr = text_offset;
1763
1764   pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT);
1765
1766   if (ARM_DEMANGLING)   /* process incomplete C++ types now */
1767     process_now(objfile);
1768
1769   end_stabs ();
1770 }
1771
1772 \f
1773 /* This handles a single symbol from the symbol-file, building symbols
1774    into a GDB symtab.  It takes these arguments and an implicit argument.
1775
1776    TYPE is the type field of the ".stab" symbol entry.
1777    DESC is the desc field of the ".stab" entry.
1778    VALU is the value field of the ".stab" entry.
1779    NAME is the symbol name, in our address space.
1780    SECTION_OFFSETS is a set of amounts by which the sections of this object
1781           file were relocated when it was loaded into memory.
1782           All symbols that refer
1783           to memory locations need to be offset by these amounts.
1784    OBJFILE is the object file from which we are reading symbols.
1785                It is used in end_symtab.  */
1786
1787 void
1788 process_one_symbol (type, desc, valu, name, section_offsets, objfile)
1789      int type, desc;
1790      CORE_ADDR valu;
1791      char *name;
1792      struct section_offsets *section_offsets;
1793      struct objfile *objfile;
1794 {
1795 #ifdef SUN_FIXED_LBRAC_BUG
1796   /* If SUN_FIXED_LBRAC_BUG is defined, then it tells us whether we need
1797      to correct the address of N_LBRAC's.  If it is not defined, then
1798      we never need to correct the addresses.  */
1799
1800   /* This records the last pc address we've seen.  We depend on there being
1801      an SLINE or FUN or SO before the first LBRAC, since the variable does
1802      not get reset in between reads of different symbol files.  */
1803   static CORE_ADDR last_pc_address;
1804 #endif
1805
1806   register struct context_stack *new;
1807   /* This remembers the address of the start of a function.  It is used
1808      because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
1809      relative to the current function's start address.  On systems
1810      other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
1811      used to relocate these symbol types rather than SECTION_OFFSETS.  */
1812   static CORE_ADDR function_start_offset;
1813
1814   /* If this is nonzero, we've seen a non-gcc N_OPT symbol for this source
1815      file.  Used to detect the SunPRO solaris compiler.  */
1816   static int n_opt_found;
1817
1818   /* The stab type used for the definition of the last function.
1819      N_STSYM or N_GSYM for SunOS4 acc; N_FUN for other compilers.  */
1820   static int function_stab_type = 0;
1821
1822   if (!block_address_function_relative)
1823     /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
1824        function start address, so just use the text offset.  */
1825     function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
1826
1827   /* Something is wrong if we see real data before
1828      seeing a source file name.  */
1829
1830   if (last_source_file == NULL && type != (unsigned char)N_SO)
1831     {
1832       /* Ignore any symbols which appear before an N_SO symbol.  Currently
1833          no one puts symbols there, but we should deal gracefully with the
1834          case.  A complain()t might be in order (if !IGNORE_SYMBOL (type)),
1835          but this should not be an error ().  */
1836       return;
1837     }
1838
1839   switch (type)
1840     {
1841     case N_FUN:
1842     case N_FNAME:
1843
1844       if (*name == '\000')
1845         {
1846           /* This N_FUN marks the end of a function.  This closes off the
1847              current block.  */
1848           within_function = 0;
1849           new = pop_context ();
1850
1851           /* Make a block for the local symbols within.  */
1852           finish_block (new->name, &local_symbols, new->old_blocks,
1853                         function_start_offset, function_start_offset + valu,
1854                         objfile);
1855           break;
1856         }
1857
1858       /* Relocate for dynamic loading */
1859       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1860       goto define_a_symbol;
1861
1862     case N_LBRAC:
1863       /* This "symbol" just indicates the start of an inner lexical
1864          context within a function.  */
1865
1866       /* Ignore extra outermost context from SunPRO cc and acc.  */
1867       if (n_opt_found && desc == 1)
1868         break;
1869
1870 #if defined(BLOCK_ADDRESS_ABSOLUTE)
1871       /* Relocate for dynamic loading (?).  */
1872       valu += function_start_offset;
1873 #else
1874       if (block_address_function_relative)
1875         /* Relocate for Sun ELF acc fn-relative syms.  */
1876         valu += function_start_offset;
1877       else
1878         /* On most machines, the block addresses are relative to the
1879            N_SO, the linker did not relocate them (sigh).  */
1880         valu += last_source_start_addr;
1881 #endif
1882
1883 #ifdef SUN_FIXED_LBRAC_BUG
1884       if (!SUN_FIXED_LBRAC_BUG && valu < last_pc_address) {
1885         /* Patch current LBRAC pc value to match last handy pc value */
1886         complain (&lbrac_complaint);
1887         valu = last_pc_address;
1888       }
1889 #endif
1890       new = push_context (desc, valu);
1891       break;
1892
1893     case N_RBRAC:
1894       /* This "symbol" just indicates the end of an inner lexical
1895          context that was started with N_LBRAC.  */
1896
1897       /* Ignore extra outermost context from SunPRO cc and acc.  */
1898       if (n_opt_found && desc == 1)
1899         break;
1900
1901 #if defined(BLOCK_ADDRESS_ABSOLUTE)
1902       /* Relocate for dynamic loading (?).  */
1903       valu += function_start_offset;
1904 #else
1905       if (block_address_function_relative)
1906         /* Relocate for Sun ELF acc fn-relative syms.  */
1907         valu += function_start_offset;
1908       else
1909         /* On most machines, the block addresses are relative to the
1910            N_SO, the linker did not relocate them (sigh).  */
1911         valu += last_source_start_addr;
1912 #endif
1913
1914       new = pop_context();
1915       if (desc != new->depth)
1916         complain (&lbrac_mismatch_complaint, symnum);
1917
1918       /* Some compilers put the variable decls inside of an
1919          LBRAC/RBRAC block.  This macro should be nonzero if this
1920          is true.  DESC is N_DESC from the N_RBRAC symbol.
1921          GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
1922          or the GCC2_COMPILED_SYMBOL.  */
1923 #if !defined (VARIABLES_INSIDE_BLOCK)
1924 #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
1925 #endif
1926
1927       /* Can only use new->locals as local symbols here if we're in
1928          gcc or on a machine that puts them before the lbrack.  */
1929       if (!VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1930         local_symbols = new->locals;
1931
1932       if (context_stack_depth
1933           > !VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1934         {
1935           /* This is not the outermost LBRAC...RBRAC pair in the function,
1936              its local symbols preceded it, and are the ones just recovered
1937              from the context stack.  Define the block for them (but don't
1938              bother if the block contains no symbols.  Should we complain
1939              on blocks without symbols?  I can't think of any useful purpose
1940              for them).  */
1941           if (local_symbols != NULL)
1942             {
1943               /* Muzzle a compiler bug that makes end < start.  (which
1944                  compilers?  Is this ever harmful?).  */
1945               if (new->start_addr > valu)
1946                 {
1947                   complain (&lbrac_rbrac_complaint);
1948                   new->start_addr = valu;
1949                 }
1950               /* Make a block for the local symbols within.  */
1951               finish_block (0, &local_symbols, new->old_blocks,
1952                             new->start_addr, valu, objfile);
1953             }
1954         }
1955       else
1956         {
1957           /* This is the outermost LBRAC...RBRAC pair.  There is no
1958              need to do anything; leave the symbols that preceded it
1959              to be attached to the function's own block.  We need to
1960              indicate that we just moved outside of the function.  */
1961           within_function = 0;
1962         }
1963
1964       if (VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1965         /* Now pop locals of block just finished.  */
1966         local_symbols = new->locals;
1967       break;
1968
1969     case N_FN:
1970     case N_FN_SEQ:
1971       /* This kind of symbol indicates the start of an object file.  */
1972       /* Relocate for dynamic loading */
1973       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1974       break;
1975
1976     case N_SO:
1977       /* This type of symbol indicates the start of data
1978          for one source file.
1979          Finish the symbol table of the previous source file
1980          (if any) and start accumulating a new symbol table.  */
1981       /* Relocate for dynamic loading */
1982       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1983
1984       n_opt_found = 0;
1985
1986 #ifdef SUN_FIXED_LBRAC_BUG
1987       last_pc_address = valu;   /* Save for SunOS bug circumcision */
1988 #endif
1989
1990 #ifdef PCC_SOL_BROKEN
1991       /* pcc bug, occasionally puts out SO for SOL.  */
1992       if (context_stack_depth > 0)
1993         {
1994           start_subfile (name, NULL);
1995           break;
1996         }
1997 #endif
1998       if (last_source_file)
1999         {
2000           /* Check if previous symbol was also an N_SO (with some
2001              sanity checks).  If so, that one was actually the directory
2002              name, and the current one is the real file name.
2003              Patch things up. */           
2004           if (previous_stab_code == (unsigned char) N_SO)
2005             {
2006               patch_subfile_names (current_subfile, name);
2007               break;            /* Ignore repeated SOs */
2008             }
2009           end_symtab (valu, objfile, SECT_OFF_TEXT);
2010           end_stabs ();
2011         }
2012
2013       /* Null name means this just marks the end of text for this .o file.
2014          Don't start a new symtab in this case.  */
2015       if (*name == '\000')
2016         break;
2017
2018       start_stabs ();
2019       start_symtab (name, NULL, valu);
2020       break;
2021
2022     case N_SOL:
2023       /* This type of symbol indicates the start of data for
2024          a sub-source-file, one whose contents were copied or
2025          included in the compilation of the main source file
2026          (whose name was given in the N_SO symbol.)  */
2027       /* Relocate for dynamic loading */
2028       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
2029       start_subfile (name, current_subfile->dirname);
2030       break;
2031
2032     case N_BINCL:
2033       push_subfile ();
2034       add_new_header_file (name, valu);
2035       start_subfile (name, current_subfile->dirname);
2036       break;
2037
2038     case N_EINCL:
2039       start_subfile (pop_subfile (), current_subfile->dirname);
2040       break;
2041
2042     case N_EXCL:
2043       add_old_header_file (name, valu);
2044       break;
2045
2046     case N_SLINE:
2047       /* This type of "symbol" really just records
2048          one line-number -- core-address correspondence.
2049          Enter it in the line list for this symbol table.  */
2050       /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
2051       valu += function_start_offset;
2052 #ifdef SUN_FIXED_LBRAC_BUG
2053       last_pc_address = valu;   /* Save for SunOS bug circumcision */
2054 #endif
2055       record_line (current_subfile, desc, valu);
2056       break;
2057
2058     case N_BCOMM:
2059       common_block_start (name, objfile);
2060       break;
2061
2062     case N_ECOMM:
2063       common_block_end (objfile);
2064       break;
2065
2066     /* The following symbol types need to have the appropriate offset added
2067        to their value; then we process symbol definitions in the name.  */
2068
2069     case N_STSYM:               /* Static symbol in data seg */
2070     case N_LCSYM:               /* Static symbol in BSS seg */
2071     case N_ROSYM:               /* Static symbol in Read-only data seg */
2072      /* HORRID HACK DEPT.  However, it's Sun's furgin' fault.
2073         Solaris2's stabs-in-elf makes *most* symbols relative
2074         but leaves a few absolute (at least for Solaris 2.1 and version
2075         2.0.1 of the SunPRO compiler).  N_STSYM and friends sit on the fence.
2076         .stab "foo:S...",N_STSYM        is absolute (ld relocates it)
2077         .stab "foo:V...",N_STSYM        is relative (section base subtracted).
2078         This leaves us no choice but to search for the 'S' or 'V'...
2079         (or pass the whole section_offsets stuff down ONE MORE function
2080         call level, which we really don't want to do).  */
2081       {
2082         char *p;
2083
2084         /* .o files and NLMs have non-zero text seg offsets, but don't need
2085            their static syms offset in this fashion.  XXX - This is really a
2086            crock that should be fixed in the solib handling code so that I
2087            don't have to work around it here. */
2088
2089         if (!symfile_relocatable)
2090           {
2091             p = strchr (name, ':');
2092             if (p != 0 && p[1] == 'S')
2093               {
2094                 /* The linker relocated it.  We don't want to add an
2095                    elfstab_offset_sections-type offset, but we *do* want
2096                    to add whatever solib.c passed to symbol_file_add as
2097                    addr (this is known to affect SunOS4, and I suspect ELF
2098                    too).  Since elfstab_offset_sections currently does not
2099                    muck with the text offset (there is no Ttext.text
2100                    symbol), we can get addr from the text offset.  If
2101                    elfstab_offset_sections ever starts dealing with the
2102                    text offset, and we still need to do this, we need to
2103                    invent a SECT_OFF_ADDR_KLUDGE or something.  */
2104                 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
2105                 goto define_a_symbol;
2106               }
2107           }
2108         /* Since it's not the kludge case, re-dispatch to the right handler. */
2109         switch (type) {
2110         case N_STSYM:   goto case_N_STSYM;
2111         case N_LCSYM:   goto case_N_LCSYM;
2112         case N_ROSYM:   goto case_N_ROSYM;
2113         default:        abort();
2114         }
2115       }
2116
2117     case_N_STSYM:               /* Static symbol in data seg */
2118     case N_DSLINE:              /* Source line number, data seg */
2119       valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
2120       goto define_a_symbol;
2121
2122     case_N_LCSYM:               /* Static symbol in BSS seg */
2123     case N_BSLINE:              /* Source line number, bss seg */
2124     /*   N_BROWS:       overlaps with N_BSLINE */
2125       valu += ANOFFSET (section_offsets, SECT_OFF_BSS);
2126       goto define_a_symbol;
2127
2128     case_N_ROSYM:               /* Static symbol in Read-only data seg */
2129       valu += ANOFFSET (section_offsets, SECT_OFF_RODATA);
2130       goto define_a_symbol;
2131
2132     case N_ENTRY:               /* Alternate entry point */
2133       /* Relocate for dynamic loading */
2134       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
2135       goto define_a_symbol;
2136
2137     /* The following symbol types we don't know how to process.  Handle
2138        them in a "default" way, but complain to people who care.  */
2139     default:
2140     case N_CATCH:               /* Exception handler catcher */
2141     case N_EHDECL:              /* Exception handler name */
2142     case N_PC:                  /* Global symbol in Pascal */
2143     case N_M2C:                 /* Modula-2 compilation unit */
2144     /*   N_MOD2:        overlaps with N_EHDECL */
2145     case N_SCOPE:               /* Modula-2 scope information */
2146     case N_ECOML:               /* End common (local name) */
2147     case N_NBTEXT:              /* Gould Non-Base-Register symbols??? */
2148     case N_NBDATA:
2149     case N_NBBSS:
2150     case N_NBSTS:
2151     case N_NBLCS:
2152       complain (&unknown_symtype_complaint, local_hex_string (type));
2153       /* FALLTHROUGH */
2154
2155     /* The following symbol types don't need the address field relocated,
2156        since it is either unused, or is absolute.  */
2157     define_a_symbol:
2158     case N_GSYM:                /* Global variable */
2159     case N_NSYMS:               /* Number of symbols (ultrix) */
2160     case N_NOMAP:               /* No map?  (ultrix) */
2161     case N_RSYM:                /* Register variable */
2162     case N_DEFD:                /* Modula-2 GNU module dependency */
2163     case N_SSYM:                /* Struct or union element */
2164     case N_LSYM:                /* Local symbol in stack */
2165     case N_PSYM:                /* Parameter variable */
2166     case N_LENG:                /* Length of preceding symbol type */
2167       if (name)
2168         {
2169           int deftype;
2170           char *colon_pos = strchr (name, ':');
2171           if (colon_pos == NULL)
2172             deftype = '\0';
2173           else
2174             deftype = colon_pos[1];
2175
2176           switch (deftype)
2177             {
2178             case 'f':
2179             case 'F':
2180               function_stab_type = type;
2181
2182 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
2183               /* Deal with the SunPRO 3.0 compiler which omits the address
2184                  from N_FUN symbols.  */
2185               if (type == N_FUN
2186                   && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT))
2187                 {
2188                   struct minimal_symbol *msym;
2189                   char *p;
2190                   int n;
2191
2192                   p = strchr (name, ':');
2193                   if (p == NULL)
2194                     p = name;
2195                   n = p - name;
2196                   p = alloca (n + 1);
2197                   strncpy (p, name, n);
2198                   p[n] = 0;
2199
2200                   msym = lookup_minimal_symbol (p, last_source_file,
2201                                                 objfile);
2202                   if (msym)
2203                     valu = SYMBOL_VALUE_ADDRESS (msym);
2204                 }
2205 #endif
2206
2207 #ifdef SUN_FIXED_LBRAC_BUG
2208               /* The Sun acc compiler, under SunOS4, puts out
2209                  functions with N_GSYM or N_STSYM.  The problem is
2210                  that the address of the symbol is no good (for N_GSYM
2211                  it doesn't even attept an address; for N_STSYM it
2212                  puts out an address but then it gets relocated
2213                  relative to the data segment, not the text segment).
2214                  Currently we can't fix this up later as we do for
2215                  some types of symbol in scan_file_globals.
2216                  Fortunately we do have a way of finding the address -
2217                  we know that the value in last_pc_address is either
2218                  the one we want (if we're dealing with the first
2219                  function in an object file), or somewhere in the
2220                  previous function. This means that we can use the
2221                  minimal symbol table to get the address.  */
2222
2223               /* Starting with release 3.0, the Sun acc compiler,
2224                  under SunOS4, puts out functions with N_FUN and a value
2225                  of zero. This gets relocated to the start of the text
2226                  segment of the module, which is no good either.
2227                  Under SunOS4 we can deal with this as N_SLINE and N_SO
2228                  entries contain valid absolute addresses.
2229                  Release 3.0 acc also puts out N_OPT entries, which makes
2230                  it possible to discern acc from cc or gcc.  */
2231
2232               if (type == N_GSYM || type == N_STSYM
2233                   || (type == N_FUN
2234                       && n_opt_found && !block_address_function_relative))
2235                 {
2236                   struct minimal_symbol *m;
2237                   int l = colon_pos - name;
2238
2239                   m = lookup_minimal_symbol_by_pc (last_pc_address);
2240                   if (m && STREQN (SYMBOL_NAME (m), name, l)
2241                       && SYMBOL_NAME (m) [l] == '\0')
2242                     /* last_pc_address was in this function */
2243                     valu = SYMBOL_VALUE (m);
2244                   else if (m && SYMBOL_NAME (m+1)
2245                            && STREQN (SYMBOL_NAME (m+1), name, l)
2246                            && SYMBOL_NAME (m+1) [l] == '\0')
2247                     /* last_pc_address was in last function */
2248                     valu = SYMBOL_VALUE (m+1);
2249                   else
2250                     /* Not found - use last_pc_address (for finish_block) */
2251                     valu = last_pc_address;
2252                 }
2253
2254               last_pc_address = valu;   /* Save for SunOS bug circumcision */
2255 #endif
2256
2257               if (block_address_function_relative)
2258                 /* For Solaris 2.0 compilers, the block addresses and
2259                    N_SLINE's are relative to the start of the
2260                    function.  On normal systems, and when using gcc on
2261                    Solaris 2.0, these addresses are just absolute, or
2262                    relative to the N_SO, depending on
2263                    BLOCK_ADDRESS_ABSOLUTE.  */
2264                 function_start_offset = valu;   
2265
2266               within_function = 1;
2267               if (context_stack_depth > 0)
2268                 {
2269                   new = pop_context ();
2270                   /* Make a block for the local symbols within.  */
2271                   finish_block (new->name, &local_symbols, new->old_blocks,
2272                                 new->start_addr, valu, objfile);
2273                 }
2274               /* Stack must be empty now.  */
2275               if (context_stack_depth != 0)
2276                 complain (&lbrac_unmatched_complaint, symnum);
2277
2278               new = push_context (0, valu);
2279               new->name = define_symbol (valu, name, desc, type, objfile);
2280               break;
2281
2282             default:
2283               define_symbol (valu, name, desc, type, objfile);
2284               break;
2285             }
2286         }
2287       break;
2288
2289     /* We use N_OPT to carry the gcc2_compiled flag.  Sun uses it
2290        for a bunch of other flags, too.  Someday we may parse their
2291        flags; for now we ignore theirs and hope they'll ignore ours.  */
2292     case N_OPT:                 /* Solaris 2:  Compiler options */
2293       if (name)
2294         {
2295           if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
2296             {
2297               processing_gcc_compilation = 2;
2298 #if 1         /* Works, but is experimental.  -fnf */
2299               if (AUTO_DEMANGLING)
2300                 {
2301                   set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
2302                 }
2303 #endif
2304             }
2305           else
2306             n_opt_found = 1;
2307         }
2308       break;
2309
2310     /* The following symbol types can be ignored.  */
2311     case N_OBJ:                 /* Solaris 2:  Object file dir and name */
2312     /*   N_UNDF:                   Solaris 2:  file separator mark */
2313     /*   N_UNDF: -- we will never encounter it, since we only process one
2314                     file's symbols at once.  */
2315     case N_ENDM:                /* Solaris 2:  End of module */
2316     case N_MAIN:                /* Name of main routine.  */
2317       break;
2318     }
2319
2320   previous_stab_code = type;
2321 }
2322 \f
2323 /* FIXME: The only difference between this and elfstab_build_psymtabs
2324    is the call to install_minimal_symbols for elf, and the support for
2325    split sections.  If the differences are really that small, the code
2326    should be shared.  */
2327
2328 /* Scan and build partial symbols for an coff symbol file.
2329    The coff file has already been processed to get its minimal symbols.
2330
2331    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2332    rolled into one.
2333
2334    OBJFILE is the object file we are reading symbols from.
2335    ADDR is the address relative to which the symbols are (e.g.
2336    the base address of the text segment).
2337    MAINLINE is true if we are reading the main symbol
2338    table (as opposed to a shared lib or dynamically loaded file).
2339    TEXTADDR is the address of the text section.
2340    TEXTSIZE is the size of the text section.
2341    STABSECTS is the list of .stab sections in OBJFILE.
2342    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2343    .stabstr section exists.
2344
2345    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2346    adjusted for coff details. */
2347
2348 void
2349 coffstab_build_psymtabs (objfile, section_offsets, mainline, 
2350                                textaddr, textsize, stabsects,
2351                                stabstroffset, stabstrsize)
2352       struct objfile *objfile;
2353       struct section_offsets *section_offsets;
2354       int mainline;
2355       CORE_ADDR textaddr;
2356       unsigned int textsize;
2357       struct stab_section_list *stabsects;
2358       file_ptr stabstroffset;
2359       unsigned int stabstrsize;
2360 {
2361   int val;
2362   bfd *sym_bfd = objfile->obfd;
2363   char *name = bfd_get_filename (sym_bfd);
2364   struct dbx_symfile_info *info;
2365   unsigned int stabsize;
2366
2367   /* There is already a dbx_symfile_info allocated by our caller.
2368      It might even contain some info from the coff symtab to help us.  */
2369   info = (struct dbx_symfile_info *) objfile->sym_stab_info;
2370
2371   DBX_TEXT_ADDR (objfile) = textaddr;
2372   DBX_TEXT_SIZE (objfile) = textsize;
2373
2374 #define COFF_STABS_SYMBOL_SIZE  12      /* XXX FIXME XXX */
2375   DBX_SYMBOL_SIZE    (objfile) = COFF_STABS_SYMBOL_SIZE;
2376   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2377   
2378   if (stabstrsize > bfd_get_size (sym_bfd))
2379     error ("ridiculous string table size: %d bytes", stabstrsize);
2380   DBX_STRINGTAB (objfile) = (char *)
2381     obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
2382   OBJSTAT (objfile, sz_strtab += stabstrsize+1);
2383
2384   /* Now read in the string table in one big gulp.  */
2385
2386   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
2387   if (val < 0)
2388     perror_with_name (name);
2389   val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2390   if (val != stabstrsize)
2391     perror_with_name (name);
2392
2393   stabsread_new_init ();
2394   buildsym_new_init ();
2395   free_header_files ();
2396   init_header_files ();
2397
2398   processing_acc_compilation = 1;
2399
2400   /* In a coff file, we've already installed the minimal symbols that came
2401      from the coff (non-stab) symbol table, so always act like an
2402      incremental load here. */
2403   if (stabsects->next == NULL)
2404     {
2405       stabsize = bfd_section_size (sym_bfd, stabsects->section);
2406       DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2407       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
2408     }
2409   else
2410     {
2411       struct stab_section_list *stabsect;
2412
2413       DBX_SYMCOUNT (objfile) = 0;
2414       for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next)
2415         {
2416           stabsize = bfd_section_size (sym_bfd, stabsect->section);
2417           DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile);
2418         }
2419
2420       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
2421
2422       symbuf_sections = stabsects->next;
2423       symbuf_left = bfd_section_size (sym_bfd, stabsects->section);
2424       symbuf_read = 0;
2425     }
2426
2427   dbx_symfile_read (objfile, section_offsets, 0);
2428 }
2429 \f
2430 /* Scan and build partial symbols for an ELF symbol file.
2431    This ELF file has already been processed to get its minimal symbols,
2432    and any DWARF symbols that were in it.
2433
2434    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2435    rolled into one.
2436
2437    OBJFILE is the object file we are reading symbols from.
2438    ADDR is the address relative to which the symbols are (e.g.
2439    the base address of the text segment).
2440    MAINLINE is true if we are reading the main symbol
2441    table (as opposed to a shared lib or dynamically loaded file).
2442    STABOFFSET and STABSIZE define the location in OBJFILE where the .stab
2443    section exists.
2444    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2445    .stabstr section exists.
2446
2447    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2448    adjusted for elf details. */
2449
2450 void
2451 elfstab_build_psymtabs (objfile, section_offsets, mainline, 
2452                                staboffset, stabsize,
2453                                stabstroffset, stabstrsize)
2454       struct objfile *objfile;
2455       struct section_offsets *section_offsets;
2456       int mainline;
2457       file_ptr staboffset;
2458       unsigned int stabsize;
2459       file_ptr stabstroffset;
2460       unsigned int stabstrsize;
2461 {
2462   int val;
2463   bfd *sym_bfd = objfile->obfd;
2464   char *name = bfd_get_filename (sym_bfd);
2465   struct dbx_symfile_info *info;
2466   asection *text_sect;
2467
2468   /* There is already a dbx_symfile_info allocated by our caller.
2469      It might even contain some info from the ELF symtab to help us.  */
2470   info = (struct dbx_symfile_info *) objfile->sym_stab_info;
2471
2472   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
2473   if (!text_sect)
2474     error ("Can't find .text section in symbol file");
2475   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
2476   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
2477
2478 #define ELF_STABS_SYMBOL_SIZE   12      /* XXX FIXME XXX */
2479   DBX_SYMBOL_SIZE    (objfile) = ELF_STABS_SYMBOL_SIZE;
2480   DBX_SYMCOUNT       (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2481   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2482   DBX_SYMTAB_OFFSET  (objfile) = staboffset;
2483   
2484   if (stabstrsize > bfd_get_size (sym_bfd))
2485     error ("ridiculous string table size: %d bytes", stabstrsize);
2486   DBX_STRINGTAB (objfile) = (char *)
2487     obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
2488   OBJSTAT (objfile, sz_strtab += stabstrsize+1);
2489
2490   /* Now read in the string table in one big gulp.  */
2491
2492   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
2493   if (val < 0)
2494     perror_with_name (name);
2495   val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2496   if (val != stabstrsize)
2497     perror_with_name (name);
2498
2499   stabsread_new_init ();
2500   buildsym_new_init ();
2501   free_header_files ();
2502   init_header_files ();
2503   install_minimal_symbols (objfile);
2504
2505   processing_acc_compilation = 1;
2506
2507   /* In an elf file, we've already installed the minimal symbols that came
2508      from the elf (non-stab) symbol table, so always act like an
2509      incremental load here. */
2510   dbx_symfile_read (objfile, section_offsets, 0);
2511 }
2512 \f
2513 /* Scan and build partial symbols for a file with special sections for stabs
2514    and stabstrings.  The file has already been processed to get its minimal
2515    symbols, and any other symbols that might be necessary to resolve GSYMs.
2516
2517    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2518    rolled into one.
2519
2520    OBJFILE is the object file we are reading symbols from.
2521    ADDR is the address relative to which the symbols are (e.g. the base address
2522         of the text segment).
2523    MAINLINE is true if we are reading the main symbol table (as opposed to a
2524             shared lib or dynamically loaded file).
2525    STAB_NAME is the name of the section that contains the stabs.
2526    STABSTR_NAME is the name of the section that contains the stab strings.
2527
2528    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
2529
2530 void
2531 stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
2532                          stabstr_name, text_name)
2533      struct objfile *objfile;
2534      struct section_offsets *section_offsets;
2535      int mainline;
2536      char *stab_name;
2537      char *stabstr_name;
2538      char *text_name;
2539 {
2540   int val;
2541   bfd *sym_bfd = objfile->obfd;
2542   char *name = bfd_get_filename (sym_bfd);
2543   asection *stabsect;
2544   asection *stabstrsect;
2545   asection *text_sect;
2546
2547   stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
2548   stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
2549
2550   if (!stabsect)
2551     return;
2552
2553   if (!stabstrsect)
2554     error ("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)",
2555            stab_name, stabstr_name);
2556
2557   objfile->sym_stab_info = (PTR) xmalloc (sizeof (struct dbx_symfile_info));
2558   memset (DBX_SYMFILE_INFO (objfile), 0, sizeof (struct dbx_symfile_info));
2559
2560   text_sect = bfd_get_section_by_name (sym_bfd, text_name);
2561   if (!text_sect)
2562     error ("Can't find %s section in symbol file", text_name);
2563   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
2564   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
2565
2566   DBX_SYMBOL_SIZE    (objfile) = sizeof (struct external_nlist);
2567   DBX_SYMCOUNT       (objfile) = bfd_section_size (sym_bfd, stabsect)
2568     / DBX_SYMBOL_SIZE (objfile);
2569   DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect);
2570   DBX_SYMTAB_OFFSET  (objfile) = stabsect->filepos; /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
2571   
2572   if (DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
2573     error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
2574   DBX_STRINGTAB (objfile) = (char *)
2575     obstack_alloc (&objfile->psymbol_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
2576   OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile) + 1);
2577
2578   /* Now read in the string table in one big gulp.  */
2579
2580   val = bfd_get_section_contents (sym_bfd, /* bfd */
2581                                   stabstrsect, /* bfd section */
2582                                   DBX_STRINGTAB (objfile), /* input buffer */
2583                                   0, /* offset into section */
2584                                   DBX_STRINGTAB_SIZE (objfile)); /* amount to read */
2585
2586   if (!val)
2587     perror_with_name (name);
2588
2589   stabsread_new_init ();
2590   buildsym_new_init ();
2591   free_header_files ();
2592   init_header_files ();
2593   install_minimal_symbols (objfile);
2594
2595   /* Now, do an incremental load */
2596
2597   processing_acc_compilation = 1;
2598   dbx_symfile_read (objfile, section_offsets, 0);
2599 }
2600 \f
2601 static struct sym_fns aout_sym_fns =
2602 {
2603   bfd_target_aout_flavour,
2604   dbx_new_init,         /* sym_new_init: init anything gbl to entire symtab */
2605   dbx_symfile_init,     /* sym_init: read initial info, setup for sym_read() */
2606   dbx_symfile_read,     /* sym_read: read a symbol file into symtab */
2607   dbx_symfile_finish,   /* sym_finish: finished with file, cleanup */
2608   default_symfile_offsets,
2609                         /* sym_offsets: parse user's offsets to internal form */
2610   NULL                  /* next: pointer to next struct sym_fns */
2611 };
2612
2613 void
2614 _initialize_dbxread ()
2615 {
2616   add_symtab_fns(&aout_sym_fns);
2617 }
This page took 0.171825 seconds and 4 git commands to generate.