1 /* Read HP PA/Risc object files for GDB.
2 Copyright 1991, 1992 Free Software Foundation, Inc.
3 Written by Fred Fish at Cygnus Support.
5 This file is part of GDB.
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.
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.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
30 #include "gdb-stabs.h"
31 #include "complaints.h"
35 #include "aout/aout64.h"
37 /* Various things we might complain about... */
40 pa_symfile_init PARAMS ((struct objfile *));
43 pa_new_init PARAMS ((struct objfile *));
46 read_unwind_info PARAMS ((struct objfile *));
49 pa_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
52 pa_symfile_finish PARAMS ((struct objfile *));
55 pa_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *));
58 free_painfo PARAMS ((PTR));
60 static struct section_offsets *
61 pa_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
64 record_minimal_symbol PARAMS ((char *, CORE_ADDR,
65 enum minimal_symbol_type,
69 record_minimal_symbol (name, address, ms_type, objfile)
72 enum minimal_symbol_type ms_type;
73 struct objfile *objfile;
75 name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
76 prim_record_minimal_symbol (name, address, ms_type);
83 pa_symtab_read -- read the symbol table of a PA file
87 void pa_symtab_read (bfd *abfd, CORE_ADDR addr,
88 struct objfile *objfile)
92 Given an open bfd, a base address to relocate symbols to, and a
93 flag that specifies whether or not this bfd is for an executable
94 or not (may be shared library for example), add all the global
95 function and data symbols to the minimal symbol table.
99 pa_symtab_read (abfd, addr, objfile)
102 struct objfile *objfile;
104 unsigned int number_of_symbols;
108 struct symbol_dictionary_record *buf, *bufp;
109 CONST int symsize = sizeof (struct symbol_dictionary_record);
111 number_of_symbols = bfd_get_symcount (abfd);
113 buf = alloca (symsize * number_of_symbols);
114 bfd_seek (abfd, obj_sym_filepos (abfd), L_SET);
115 val = bfd_read (buf, symsize * number_of_symbols, 1, abfd);
116 if (val != symsize * number_of_symbols)
117 error ("Couldn't read symbol dictionary!");
119 stringtab = alloca (obj_stringtab_size (abfd));
120 bfd_seek (abfd, obj_str_filepos (abfd), L_SET);
121 val = bfd_read (stringtab, obj_stringtab_size (abfd), 1, abfd);
122 if (val != obj_stringtab_size (abfd))
123 error ("Can't read in HP string table.");
125 for (i = 0, bufp = buf; i < number_of_symbols; i++, bufp++)
127 enum minimal_symbol_type ms_type;
131 if (bufp->symbol_scope != SS_UNIVERSAL)
134 switch (bufp->symbol_type)
145 bufp->symbol_value &= ~0x3; /* clear out permission bits */
154 if (bufp->name.n_strx > obj_stringtab_size (abfd))
155 error ("Invalid symbol data; bad HP string table offset: %d",
158 record_minimal_symbol (bufp->name.n_strx + stringtab,
159 bufp->symbol_value, ms_type,
163 install_minimal_symbols (objfile);
166 /* Read in the backtrace information stored in the `$UNWIND_START$' section of
167 the object file. This info is used mainly by find_unwind_entry() to find
168 out the stack frame size and frame pointer used by procedures. We put
169 everything on the psymbol obstack in the objfile so that it automatically
170 gets freed when the objfile is destroyed. */
173 read_unwind_info (objfile)
174 struct objfile *objfile;
176 asection *unwind_sec;
177 struct obj_unwind_info *ui;
179 ui = obstack_alloc (&objfile->psymbol_obstack,
180 sizeof (struct obj_unwind_info));
186 unwind_sec = bfd_get_section_by_name (objfile->obfd,
193 size = bfd_section_size (objfile->obfd, unwind_sec);
194 ui->table = obstack_alloc (&objfile->psymbol_obstack, size);
195 ui->last = size / sizeof (struct unwind_table_entry) - 1;
197 bfd_get_section_contents (objfile->obfd, unwind_sec, ui->table,
200 OBJ_UNWIND_INFO (objfile) = ui;
204 /* Scan and build partial symbols for a symbol file.
205 We have been initialized by a call to pa_symfile_init, which
206 currently does nothing.
208 SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
209 in each section. This is ignored, as it isn't needed for the PA.
211 MAINLINE is true if we are reading the main symbol
212 table (as opposed to a shared lib or dynamically loaded file).
214 This function only does the minimum work necessary for letting the
215 user "name" things symbolically; it does not read the entire symtab.
216 Instead, it reads the external and static symbols and puts them in partial
217 symbol tables. When more extensive information is requested of a
218 file, the corresponding partial symbol table is mutated into a full
219 fledged symbol table by going back and reading the symbols
222 We look for sections with specific names, to tell us what debug
223 format to look for: FIXME!!!
225 pastab_build_psymtabs() handles STABS symbols.
227 Note that PA files have a "minimal" symbol table, which is vaguely
228 reminiscent of a COFF symbol table, but has only the minimal information
229 necessary for linking. We process this also, and use the information to
230 build gdb's minimal symbol table. This gives us some minimal debugging
231 capability even for files compiled without -g. */
234 pa_symfile_read (objfile, section_offsets, mainline)
235 struct objfile *objfile;
236 struct section_offsets *section_offsets;
239 bfd *abfd = objfile->obfd;
240 struct cleanup *back_to;
243 init_minimal_symbol_collection ();
244 back_to = make_cleanup (discard_minimal_symbols, 0);
246 make_cleanup (free_painfo, (PTR) objfile);
248 /* Process the normal PA symbol table first. */
250 /* FIXME, should take a section_offsets param, not just an offset. */
252 offset = ANOFFSET (section_offsets, 0);
253 pa_symtab_read (abfd, offset, objfile);
255 /* Now process debugging information, which is contained in
256 special PA sections. */
258 pastab_build_psymtabs (objfile, section_offsets, mainline);
260 read_unwind_info(objfile);
262 do_cleanups (back_to);
265 /* This cleans up the objfile's sym_private pointer, and the chain of
266 stab_section_info's, that might be dangling from it. */
272 struct objfile *objfile = (struct objfile *)objp;
273 struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
274 objfile->sym_private;
275 struct stab_section_info *ssi, *nssi;
277 ssi = dbxinfo->stab_section_info;
281 mfree (objfile->md, ssi);
285 dbxinfo->stab_section_info = 0; /* Just say No mo info about this. */
288 /* Initialize anything that needs initializing when a completely new symbol
289 file is specified (not just adding some symbols from another file, e.g. a
292 We reinitialize buildsym, since we may be reading stabs from a PA file. */
296 struct objfile *ignore;
298 stabsread_new_init ();
299 buildsym_new_init ();
302 /* Perform any local cleanups required when we are done with a particular
303 objfile. I.E, we are in the process of discarding all symbol information
304 for an objfile, freeing up all memory held for it, and unlinking the
305 objfile struct from the global list of known objfiles. */
308 pa_symfile_finish (objfile)
309 struct objfile *objfile;
311 if (objfile -> sym_private != NULL)
313 mfree (objfile -> md, objfile -> sym_private);
317 /* PA specific initialization routine for reading symbols.
319 It is passed a pointer to a struct sym_fns which contains, among other
320 things, the BFD for the file whose symbols are being read, and a slot for
321 a pointer to "private data" which we can fill with goodies.
323 This routine is almost a complete ripoff of dbx_symfile_init. The
324 common parts of these routines should be extracted and used instead of
325 duplicating this code. FIXME. */
328 pa_symfile_init (objfile)
329 struct objfile *objfile;
332 bfd *sym_bfd = objfile->obfd;
333 char *name = bfd_get_filename (sym_bfd);
334 asection *stabsect; /* Section containing symbol table entries */
335 asection *stringsect; /* Section containing symbol name strings */
337 stabsect = bfd_get_section_by_name (sym_bfd, "$GDB_SYMBOLS$");
338 stringsect = bfd_get_section_by_name (sym_bfd, "$GDB_STRINGS$");
340 /* Allocate struct to keep track of the symfile */
341 objfile->sym_private = (PTR)
342 xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
344 memset ((PTR) objfile->sym_private, 0, sizeof (struct dbx_symfile_info));
350 error ("Found stabs, but not string section");
352 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
353 #define STRING_TABLE_OFFSET (stringsect->filepos)
354 #define SYMBOL_TABLE_OFFSET (stabsect->filepos)
356 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
358 DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
359 DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
360 if (!DBX_TEXT_SECT (objfile))
361 error ("Can't find .text section in symbol file");
363 DBX_SYMBOL_SIZE (objfile) = sizeof (struct internal_nlist);
364 DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
365 / DBX_SYMBOL_SIZE (objfile);
366 DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
368 /* Read the string table and stash it away in the psymbol_obstack. It is
369 only needed as long as we need to expand psymbols into full symbols,
370 so when we blow away the psymbol the string table goes away as well.
371 Note that gdb used to use the results of attempting to malloc the
372 string table, based on the size it read, as a form of sanity check
373 for botched byte swapping, on the theory that a byte swapped string
374 table size would be so totally bogus that the malloc would fail. Now
375 that we put in on the psymbol_obstack, we can't do this since gdb gets
376 a fatal error (out of virtual memory) if the size is bogus. We can
377 however at least check to see if the size is zero or some negative
380 DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stringsect);
382 if (DBX_SYMCOUNT (objfile) == 0
383 || DBX_STRINGTAB_SIZE (objfile) == 0)
386 if (DBX_STRINGTAB_SIZE (objfile) <= 0
387 || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
388 error ("ridiculous string table size (%d bytes).",
389 DBX_STRINGTAB_SIZE (objfile));
391 DBX_STRINGTAB (objfile) =
392 (char *) obstack_alloc (&objfile -> psymbol_obstack,
393 DBX_STRINGTAB_SIZE (objfile));
395 /* Now read in the string table in one big gulp. */
397 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
399 perror_with_name (name);
400 val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
402 if (val != DBX_STRINGTAB_SIZE (objfile))
403 perror_with_name (name);
406 /* PA specific parsing routine for section offsets.
408 Plain and simple for now. */
410 static struct section_offsets *
411 pa_symfile_offsets (objfile, addr)
412 struct objfile *objfile;
415 struct section_offsets *section_offsets;
418 section_offsets = (struct section_offsets *)
419 obstack_alloc (&objfile -> psymbol_obstack,
420 sizeof (struct section_offsets) +
421 sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
423 for (i = 0; i < SECT_OFF_MAX; i++)
424 ANOFFSET (section_offsets, i) = addr;
426 return section_offsets;
429 /* Register that we are able to handle PA object file formats. */
431 /* This is probably a mistake. FIXME. Why can't the HP's use an ordinary
432 file format name with an -hppa suffix? */
433 static struct sym_fns pa_sym_fns =
435 "hppa", /* sym_name: name or name prefix of BFD target type */
436 4, /* sym_namelen: number of significant sym_name chars */
437 pa_new_init, /* sym_new_init: init anything gbl to entire symtab */
438 pa_symfile_init, /* sym_init: read initial info, setup for sym_read() */
439 pa_symfile_read, /* sym_read: read a symbol file into symtab */
440 pa_symfile_finish, /* sym_finish: finished with file, cleanup */
441 pa_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */
442 NULL /* next: pointer to next struct sym_fns */
446 _initialize_paread ()
448 add_symtab_fns (&pa_sym_fns);