a4425a91c34615475febda51106edc1b8696f451
[deliverable/binutils-gdb.git] / gdb / paread.c
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.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 #include "defs.h"
22 #include "bfd.h"
23 #include "libbfd.h"
24 #include "libhppa.h"
25 #include <syms.h>
26 #include "symtab.h"
27 #include "symfile.h"
28 #include "objfiles.h"
29 #include "buildsym.h"
30 #include "gdb-stabs.h"
31 #include "complaints.h"
32 #include <string.h>
33 #include "demangle.h"
34 #include <sys/file.h>
35 #include "aout/aout64.h"
36
37 /* Various things we might complain about... */
38
39 static void
40 pa_symfile_init PARAMS ((struct objfile *));
41
42 static void
43 pa_new_init PARAMS ((struct objfile *));
44
45 static void
46 read_unwind_info PARAMS ((struct objfile *));
47
48 static void
49 pa_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
50
51 static void
52 pa_symfile_finish PARAMS ((struct objfile *));
53
54 static void
55 pa_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *));
56
57 static void
58 free_painfo PARAMS ((PTR));
59
60 static struct section_offsets *
61 pa_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
62
63 static void
64 record_minimal_symbol PARAMS ((char *, CORE_ADDR,
65 enum minimal_symbol_type,
66 struct objfile *));
67
68 static void
69 record_minimal_symbol (name, address, ms_type, objfile)
70 char *name;
71 CORE_ADDR address;
72 enum minimal_symbol_type ms_type;
73 struct objfile *objfile;
74 {
75 name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
76 prim_record_minimal_symbol (name, address, ms_type);
77 }
78
79 /*
80
81 LOCAL FUNCTION
82
83 pa_symtab_read -- read the symbol table of a PA file
84
85 SYNOPSIS
86
87 void pa_symtab_read (bfd *abfd, CORE_ADDR addr,
88 struct objfile *objfile)
89
90 DESCRIPTION
91
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.
96 */
97
98 static void
99 pa_symtab_read (abfd, addr, objfile)
100 bfd *abfd;
101 CORE_ADDR addr;
102 struct objfile *objfile;
103 {
104 unsigned int number_of_symbols;
105 unsigned int i;
106 int val;
107 char *stringtab;
108 struct symbol_dictionary_record *buf, *bufp, *endbufp;
109 char *symname;
110 CONST int symsize = sizeof (struct symbol_dictionary_record);
111
112 number_of_symbols = bfd_get_symcount (abfd);
113
114 buf = alloca (symsize * number_of_symbols);
115 bfd_seek (abfd, obj_sym_filepos (abfd), L_SET);
116 val = bfd_read (buf, symsize * number_of_symbols, 1, abfd);
117 if (val != symsize * number_of_symbols)
118 error ("Couldn't read symbol dictionary!");
119
120 stringtab = alloca (obj_stringtab_size (abfd));
121 bfd_seek (abfd, obj_str_filepos (abfd), L_SET);
122 val = bfd_read (stringtab, obj_stringtab_size (abfd), 1, abfd);
123 if (val != obj_stringtab_size (abfd))
124 error ("Can't read in HP string table.");
125
126 endbufp = buf + number_of_symbols;
127 for (bufp = buf; bufp < endbufp; ++bufp)
128 {
129 enum minimal_symbol_type ms_type;
130
131 QUIT;
132
133 switch (bufp->symbol_scope)
134 {
135 case SS_UNIVERSAL:
136 switch (bufp->symbol_type)
137 {
138 case ST_SYM_EXT:
139 case ST_ARG_EXT:
140 continue;
141
142 case ST_CODE:
143 case ST_PRI_PROG:
144 case ST_SEC_PROG:
145 case ST_ENTRY:
146 case ST_MILLICODE:
147 symname = bufp->name.n_strx + stringtab;
148 ms_type = mst_text;
149 bufp->symbol_value &= ~0x3; /* clear out permission bits */
150 break;
151 case ST_DATA:
152 symname = bufp->name.n_strx + stringtab;
153 ms_type = mst_data;
154 break;
155 default:
156 continue;
157 }
158 break;
159
160 #if 0
161 /* SS_GLOBAL and SS_LOCAL are two names for the same thing (!). */
162 case SS_GLOBAL:
163 #endif
164 case SS_LOCAL:
165 switch (bufp->symbol_type)
166 {
167 case ST_SYM_EXT:
168 case ST_ARG_EXT:
169 continue;
170
171 case ST_CODE:
172 symname = bufp->name.n_strx + stringtab;
173 ms_type = mst_file_text;
174 bufp->symbol_value &= ~0x3; /* clear out permission bits */
175
176 check_strange_names:
177 /* GAS leaves symbols with the prefixes "LS$", "LBB$",
178 and "LBE$" in .o files after assembling. And thus
179 they appear in the final executable. This can
180 cause problems if these special symbols have the
181 same value as real symbols. So ignore them. Also "LC$". */
182 if (*symname == 'L'
183 && (symname[2] == '$' || symname[3] == '$'))
184 continue;
185 break;
186
187 case ST_PRI_PROG:
188 case ST_SEC_PROG:
189 case ST_ENTRY:
190 case ST_MILLICODE:
191 symname = bufp->name.n_strx + stringtab;
192 ms_type = mst_file_text;
193 bufp->symbol_value &= ~0x3; /* clear out permission bits */
194 break;
195
196 case ST_DATA:
197 symname = bufp->name.n_strx + stringtab;
198 ms_type = mst_file_data;
199 goto check_strange_names;
200
201 default:
202 continue;
203 }
204 break;
205
206 default:
207 continue;
208 }
209
210 if (bufp->name.n_strx > obj_stringtab_size (abfd))
211 error ("Invalid symbol data; bad HP string table offset: %d",
212 bufp->name.n_strx);
213
214 record_minimal_symbol (symname,
215 bufp->symbol_value, ms_type,
216 objfile);
217 }
218
219 install_minimal_symbols (objfile);
220 }
221
222 /* Read in the backtrace information stored in the `$UNWIND_START$' section of
223 the object file. This info is used mainly by find_unwind_entry() to find
224 out the stack frame size and frame pointer used by procedures. We put
225 everything on the psymbol obstack in the objfile so that it automatically
226 gets freed when the objfile is destroyed. */
227
228 static void
229 read_unwind_info (objfile)
230 struct objfile *objfile;
231 {
232 asection *unwind_sec;
233 struct obj_unwind_info *ui;
234
235 ui = obstack_alloc (&objfile->psymbol_obstack,
236 sizeof (struct obj_unwind_info));
237
238 ui->table = NULL;
239 ui->cache = NULL;
240 ui->last = -1;
241
242 unwind_sec = bfd_get_section_by_name (objfile->obfd,
243 "$UNWIND_START$");
244 if (unwind_sec)
245 {
246 int size;
247 int i, *ip;
248
249 size = bfd_section_size (objfile->obfd, unwind_sec);
250 ui->table = obstack_alloc (&objfile->psymbol_obstack, size);
251 ui->last = size / sizeof (struct unwind_table_entry) - 1;
252
253 bfd_get_section_contents (objfile->obfd, unwind_sec, ui->table,
254 0, size);
255
256 OBJ_UNWIND_INFO (objfile) = ui;
257 }
258 }
259
260 /* Scan and build partial symbols for a symbol file.
261 We have been initialized by a call to pa_symfile_init, which
262 currently does nothing.
263
264 SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
265 in each section. This is ignored, as it isn't needed for the PA.
266
267 MAINLINE is true if we are reading the main symbol
268 table (as opposed to a shared lib or dynamically loaded file).
269
270 This function only does the minimum work necessary for letting the
271 user "name" things symbolically; it does not read the entire symtab.
272 Instead, it reads the external and static symbols and puts them in partial
273 symbol tables. When more extensive information is requested of a
274 file, the corresponding partial symbol table is mutated into a full
275 fledged symbol table by going back and reading the symbols
276 for real.
277
278 We look for sections with specific names, to tell us what debug
279 format to look for: FIXME!!!
280
281 pastab_build_psymtabs() handles STABS symbols.
282
283 Note that PA files have a "minimal" symbol table, which is vaguely
284 reminiscent of a COFF symbol table, but has only the minimal information
285 necessary for linking. We process this also, and use the information to
286 build gdb's minimal symbol table. This gives us some minimal debugging
287 capability even for files compiled without -g. */
288
289 static void
290 pa_symfile_read (objfile, section_offsets, mainline)
291 struct objfile *objfile;
292 struct section_offsets *section_offsets;
293 int mainline;
294 {
295 bfd *abfd = objfile->obfd;
296 struct cleanup *back_to;
297 CORE_ADDR offset;
298
299 init_minimal_symbol_collection ();
300 back_to = make_cleanup (discard_minimal_symbols, 0);
301
302 make_cleanup (free_painfo, (PTR) objfile);
303
304 /* Process the normal PA symbol table first. */
305
306 /* FIXME, should take a section_offsets param, not just an offset. */
307
308 offset = ANOFFSET (section_offsets, 0);
309 pa_symtab_read (abfd, offset, objfile);
310
311 /* Now process debugging information, which is contained in
312 special PA sections. */
313
314 pastab_build_psymtabs (objfile, section_offsets, mainline);
315
316 read_unwind_info(objfile);
317
318 do_cleanups (back_to);
319 }
320
321 /* This cleans up the objfile's sym_private pointer, and the chain of
322 stab_section_info's, that might be dangling from it. */
323
324 static void
325 free_painfo (objp)
326 PTR objp;
327 {
328 struct objfile *objfile = (struct objfile *)objp;
329 struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
330 objfile->sym_private;
331 struct stab_section_info *ssi, *nssi;
332
333 ssi = dbxinfo->stab_section_info;
334 while (ssi)
335 {
336 nssi = ssi->next;
337 mfree (objfile->md, ssi);
338 ssi = nssi;
339 }
340
341 dbxinfo->stab_section_info = 0; /* Just say No mo info about this. */
342 }
343
344 /* Initialize anything that needs initializing when a completely new symbol
345 file is specified (not just adding some symbols from another file, e.g. a
346 shared library).
347
348 We reinitialize buildsym, since we may be reading stabs from a PA file. */
349
350 static void
351 pa_new_init (ignore)
352 struct objfile *ignore;
353 {
354 stabsread_new_init ();
355 buildsym_new_init ();
356 }
357
358 /* Perform any local cleanups required when we are done with a particular
359 objfile. I.E, we are in the process of discarding all symbol information
360 for an objfile, freeing up all memory held for it, and unlinking the
361 objfile struct from the global list of known objfiles. */
362
363 static void
364 pa_symfile_finish (objfile)
365 struct objfile *objfile;
366 {
367 if (objfile -> sym_private != NULL)
368 {
369 mfree (objfile -> md, objfile -> sym_private);
370 }
371 }
372
373 /* PA specific initialization routine for reading symbols.
374
375 It is passed a pointer to a struct sym_fns which contains, among other
376 things, the BFD for the file whose symbols are being read, and a slot for
377 a pointer to "private data" which we can fill with goodies.
378
379 This routine is almost a complete ripoff of dbx_symfile_init. The
380 common parts of these routines should be extracted and used instead of
381 duplicating this code. FIXME. */
382
383 static void
384 pa_symfile_init (objfile)
385 struct objfile *objfile;
386 {
387 int val;
388 bfd *sym_bfd = objfile->obfd;
389 char *name = bfd_get_filename (sym_bfd);
390 asection *stabsect; /* Section containing symbol table entries */
391 asection *stringsect; /* Section containing symbol name strings */
392
393 stabsect = bfd_get_section_by_name (sym_bfd, "$GDB_SYMBOLS$");
394 stringsect = bfd_get_section_by_name (sym_bfd, "$GDB_STRINGS$");
395
396 /* Allocate struct to keep track of the symfile */
397 objfile->sym_private = (PTR)
398 xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
399
400 memset ((PTR) objfile->sym_private, 0, sizeof (struct dbx_symfile_info));
401
402 if (!stabsect)
403 return;
404
405 if (!stringsect)
406 error ("Found stabs, but not string section");
407
408 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
409 #define STRING_TABLE_OFFSET (stringsect->filepos)
410 #define SYMBOL_TABLE_OFFSET (stabsect->filepos)
411
412 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
413
414 DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
415 DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
416 if (!DBX_TEXT_SECT (objfile))
417 error ("Can't find .text section in symbol file");
418
419 DBX_SYMBOL_SIZE (objfile) = sizeof (struct internal_nlist);
420 DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
421 / DBX_SYMBOL_SIZE (objfile);
422 DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
423
424 /* Read the string table and stash it away in the psymbol_obstack. It is
425 only needed as long as we need to expand psymbols into full symbols,
426 so when we blow away the psymbol the string table goes away as well.
427 Note that gdb used to use the results of attempting to malloc the
428 string table, based on the size it read, as a form of sanity check
429 for botched byte swapping, on the theory that a byte swapped string
430 table size would be so totally bogus that the malloc would fail. Now
431 that we put in on the psymbol_obstack, we can't do this since gdb gets
432 a fatal error (out of virtual memory) if the size is bogus. We can
433 however at least check to see if the size is zero or some negative
434 value. */
435
436 DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stringsect);
437
438 if (DBX_SYMCOUNT (objfile) == 0
439 || DBX_STRINGTAB_SIZE (objfile) == 0)
440 return;
441
442 if (DBX_STRINGTAB_SIZE (objfile) <= 0
443 || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
444 error ("ridiculous string table size (%d bytes).",
445 DBX_STRINGTAB_SIZE (objfile));
446
447 DBX_STRINGTAB (objfile) =
448 (char *) obstack_alloc (&objfile -> psymbol_obstack,
449 DBX_STRINGTAB_SIZE (objfile));
450
451 /* Now read in the string table in one big gulp. */
452
453 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
454 if (val < 0)
455 perror_with_name (name);
456 val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
457 sym_bfd);
458 if (val == 0)
459 error ("End of file reading string table");
460 else if (val < 0)
461 /* It's possible bfd_read should be setting bfd_error, and we should be
462 checking that. But currently it doesn't set bfd_error. */
463 perror_with_name (name);
464 else if (val != DBX_STRINGTAB_SIZE (objfile))
465 error ("Short read reading string table");
466 }
467
468 /* PA specific parsing routine for section offsets.
469
470 Plain and simple for now. */
471
472 static struct section_offsets *
473 pa_symfile_offsets (objfile, addr)
474 struct objfile *objfile;
475 CORE_ADDR addr;
476 {
477 struct section_offsets *section_offsets;
478 int i;
479
480 section_offsets = (struct section_offsets *)
481 obstack_alloc (&objfile -> psymbol_obstack,
482 sizeof (struct section_offsets) +
483 sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
484
485 for (i = 0; i < SECT_OFF_MAX; i++)
486 ANOFFSET (section_offsets, i) = addr;
487
488 return section_offsets;
489 }
490 \f
491 /* Register that we are able to handle PA object file formats. */
492
493 /* This is probably a mistake. FIXME. Why can't the HP's use an ordinary
494 file format name with an -hppa suffix? */
495 static struct sym_fns pa_sym_fns =
496 {
497 "hppa", /* sym_name: name or name prefix of BFD target type */
498 4, /* sym_namelen: number of significant sym_name chars */
499 pa_new_init, /* sym_new_init: init anything gbl to entire symtab */
500 pa_symfile_init, /* sym_init: read initial info, setup for sym_read() */
501 pa_symfile_read, /* sym_read: read a symbol file into symtab */
502 pa_symfile_finish, /* sym_finish: finished with file, cleanup */
503 pa_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */
504 NULL /* next: pointer to next struct sym_fns */
505 };
506
507 void
508 _initialize_paread ()
509 {
510 add_symtab_fns (&pa_sym_fns);
511 }
This page took 0.038939 seconds and 3 git commands to generate.