1 /* Read HP PA/Risc object files for GDB.
2 Copyright 1991, 1992, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4 Written by Fred Fish at Cygnus Support.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
30 #include "stabsread.h"
31 #include "gdb-stabs.h"
32 #include "complaints.h"
33 #include "gdb_string.h"
38 /* Various things we might complain about... */
40 static void som_symfile_init (struct objfile
*);
42 static void som_new_init (struct objfile
*);
44 static void som_symfile_read (struct objfile
*, int);
46 static void som_symfile_finish (struct objfile
*);
49 som_symtab_read (bfd
*, struct objfile
*, struct section_offsets
*);
52 som_symfile_offsets (struct objfile
*, struct section_addr_info
*);
54 /* FIXME: These should really be in a common header somewhere */
56 extern void hpread_build_psymtabs (struct objfile
*, int);
58 extern void hpread_symfile_finish (struct objfile
*);
60 extern void hpread_symfile_init (struct objfile
*);
62 extern void do_pxdb (bfd
*);
68 som_symtab_read -- read the symbol table of a SOM file
72 void som_symtab_read (bfd *abfd, struct objfile *objfile,
73 struct section_offsets *section_offsets)
77 Given an open bfd, a base address to relocate symbols to, and a
78 flag that specifies whether or not this bfd is for an executable
79 or not (may be shared library for example), add all the global
80 function and data symbols to the minimal symbol table.
84 som_symtab_read (bfd
*abfd
, struct objfile
*objfile
,
85 struct section_offsets
*section_offsets
)
87 unsigned int number_of_symbols
;
91 struct symbol_dictionary_record
*buf
, *bufp
, *endbufp
;
93 CONST
int symsize
= sizeof (struct symbol_dictionary_record
);
94 CORE_ADDR text_offset
, data_offset
;
97 text_offset
= ANOFFSET (section_offsets
, 0);
98 data_offset
= ANOFFSET (section_offsets
, 1);
100 number_of_symbols
= bfd_get_symcount (abfd
);
102 /* FIXME (alloca): could be quite large. */
103 buf
= alloca (symsize
* number_of_symbols
);
104 bfd_seek (abfd
, obj_som_sym_filepos (abfd
), SEEK_SET
);
105 val
= bfd_bread (buf
, symsize
* number_of_symbols
, abfd
);
106 if (val
!= symsize
* number_of_symbols
)
107 error ("Couldn't read symbol dictionary!");
109 /* FIXME (alloca): could be quite large. */
110 stringtab
= alloca (obj_som_stringtab_size (abfd
));
111 bfd_seek (abfd
, obj_som_str_filepos (abfd
), SEEK_SET
);
112 val
= bfd_bread (stringtab
, obj_som_stringtab_size (abfd
), abfd
);
113 if (val
!= obj_som_stringtab_size (abfd
))
114 error ("Can't read in HP string table.");
116 /* We need to determine if objfile is a dynamic executable (so we
117 can do the right thing for ST_ENTRY vs ST_CODE symbols).
119 There's nothing in the header which easily allows us to do
122 This code used to rely upon the existence of a $SHLIB_INFO$
123 section to make this determination. HP claims that it is
124 more accurate to check for a nonzero text offset, but they
125 have not provided any information about why that test is
127 dynamic
= (text_offset
!= 0);
129 endbufp
= buf
+ number_of_symbols
;
130 for (bufp
= buf
; bufp
< endbufp
; ++bufp
)
132 enum minimal_symbol_type ms_type
;
136 switch (bufp
->symbol_scope
)
140 switch (bufp
->symbol_type
)
150 symname
= bufp
->name
.n_strx
+ stringtab
;
152 bufp
->symbol_value
+= text_offset
;
153 bufp
->symbol_value
= SMASH_TEXT_ADDRESS (bufp
->symbol_value
);
157 symname
= bufp
->name
.n_strx
+ stringtab
;
158 /* For a dynamic executable, ST_ENTRY symbols are
159 the stubs, while the ST_CODE symbol is the real
162 ms_type
= mst_solib_trampoline
;
165 bufp
->symbol_value
+= text_offset
;
166 bufp
->symbol_value
= SMASH_TEXT_ADDRESS (bufp
->symbol_value
);
170 symname
= bufp
->name
.n_strx
+ stringtab
;
171 ms_type
= mst_solib_trampoline
;
172 bufp
->symbol_value
+= text_offset
;
173 bufp
->symbol_value
= SMASH_TEXT_ADDRESS (bufp
->symbol_value
);
177 symname
= bufp
->name
.n_strx
+ stringtab
;
178 bufp
->symbol_value
+= data_offset
;
187 /* SS_GLOBAL and SS_LOCAL are two names for the same thing (!). */
191 switch (bufp
->symbol_type
)
198 symname
= bufp
->name
.n_strx
+ stringtab
;
199 ms_type
= mst_file_text
;
200 bufp
->symbol_value
+= text_offset
;
201 bufp
->symbol_value
= SMASH_TEXT_ADDRESS (bufp
->symbol_value
);
204 /* Utah GCC 2.5, FSF GCC 2.6 and later generate correct local
205 label prefixes for stabs, constant data, etc. So we need
206 only filter out L$ symbols which are left in due to
207 limitations in how GAS generates SOM relocations.
209 When linking in the HPUX C-library the HP linker has
210 the nasty habit of placing section symbols from the literal
211 subspaces in the middle of the program's text. Filter
212 those out as best we can. Check for first and last character
215 And finally, the newer HP compilers emit crud like $PIC_foo$N
216 in some circumstance (PIC code I guess). It's also claimed
217 that they emit D$ symbols too. What stupidity. */
218 if ((symname
[0] == 'L' && symname
[1] == '$')
219 || (symname
[0] == '$' && symname
[strlen (symname
) - 1] == '$')
220 || (symname
[0] == 'D' && symname
[1] == '$')
221 || (strncmp (symname
, "$PIC", 4) == 0))
228 symname
= bufp
->name
.n_strx
+ stringtab
;
229 ms_type
= mst_file_text
;
230 bufp
->symbol_value
+= text_offset
;
231 bufp
->symbol_value
= SMASH_TEXT_ADDRESS (bufp
->symbol_value
);
235 symname
= bufp
->name
.n_strx
+ stringtab
;
236 /* SS_LOCAL symbols in a shared library do not have
237 export stubs, so we do not have to worry about
238 using mst_file_text vs mst_solib_trampoline here like
239 we do for SS_UNIVERSAL and SS_EXTERNAL symbols above. */
240 ms_type
= mst_file_text
;
241 bufp
->symbol_value
+= text_offset
;
242 bufp
->symbol_value
= SMASH_TEXT_ADDRESS (bufp
->symbol_value
);
246 symname
= bufp
->name
.n_strx
+ stringtab
;
247 ms_type
= mst_solib_trampoline
;
248 bufp
->symbol_value
+= text_offset
;
249 bufp
->symbol_value
= SMASH_TEXT_ADDRESS (bufp
->symbol_value
);
254 symname
= bufp
->name
.n_strx
+ stringtab
;
255 bufp
->symbol_value
+= data_offset
;
256 ms_type
= mst_file_data
;
257 goto check_strange_names
;
264 /* This can happen for common symbols when -E is passed to the
265 final link. No idea _why_ that would make the linker force
266 common symbols to have an SS_UNSAT scope, but it does.
268 This also happens for weak symbols, but their type is
271 switch (bufp
->symbol_type
)
275 symname
= bufp
->name
.n_strx
+ stringtab
;
276 bufp
->symbol_value
+= data_offset
;
289 if (bufp
->name
.n_strx
> obj_som_stringtab_size (abfd
))
290 error ("Invalid symbol data; bad HP string table offset: %d",
293 prim_record_minimal_symbol (symname
, bufp
->symbol_value
, ms_type
,
298 /* Scan and build partial symbols for a symbol file.
299 We have been initialized by a call to som_symfile_init, which
300 currently does nothing.
302 SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
303 in each section. This is ignored, as it isn't needed for SOM.
305 MAINLINE is true if we are reading the main symbol
306 table (as opposed to a shared lib or dynamically loaded file).
308 This function only does the minimum work necessary for letting the
309 user "name" things symbolically; it does not read the entire symtab.
310 Instead, it reads the external and static symbols and puts them in partial
311 symbol tables. When more extensive information is requested of a
312 file, the corresponding partial symbol table is mutated into a full
313 fledged symbol table by going back and reading the symbols
316 We look for sections with specific names, to tell us what debug
317 format to look for: FIXME!!!
319 somstab_build_psymtabs() handles STABS symbols.
321 Note that SOM files have a "minimal" symbol table, which is vaguely
322 reminiscent of a COFF symbol table, but has only the minimal information
323 necessary for linking. We process this also, and use the information to
324 build gdb's minimal symbol table. This gives us some minimal debugging
325 capability even for files compiled without -g. */
328 som_symfile_read (struct objfile
*objfile
, int mainline
)
330 bfd
*abfd
= objfile
->obfd
;
331 struct cleanup
*back_to
;
333 do_pxdb (symfile_bfd_open (objfile
->name
));
335 init_minimal_symbol_collection ();
336 back_to
= make_cleanup_discard_minimal_symbols ();
338 /* Read in the import list and the export list. Currently
339 the export list isn't used; the import list is used in
340 hp-symtab-read.c to handle static vars declared in other
342 init_import_symbols (objfile
);
343 #if 0 /* Export symbols not used today 1997-08-05 */
344 init_export_symbols (objfile
);
346 objfile
->export_list
= NULL
;
347 objfile
->export_list_size
= 0;
350 /* Process the normal SOM symbol table first.
351 This reads in the DNTT and string table, but doesn't
352 actually scan the DNTT. It does scan the linker symbol
353 table and thus build up a "minimal symbol table". */
355 som_symtab_read (abfd
, objfile
, objfile
->section_offsets
);
357 /* Now read information from the stabs debug sections.
358 This is a no-op for SOM.
359 Perhaps it is intended for some kind of mixed STABS/SOM
361 stabsect_build_psymtabs (objfile
, mainline
,
362 "$GDB_SYMBOLS$", "$GDB_STRINGS$", "$TEXT$");
364 /* Now read the native debug information.
365 This builds the psymtab. This used to be done via a scan of
366 the DNTT, but is now done via the PXDB-built quick-lookup tables
367 together with a scan of the GNTT. See hp-psymtab-read.c. */
368 hpread_build_psymtabs (objfile
, mainline
);
370 /* Install any minimal symbols that have been collected as the current
371 minimal symbols for this objfile.
372 Further symbol-reading is done incrementally, file-by-file,
373 in a step known as "psymtab-to-symtab" expansion. hp-symtab-read.c
374 contains the code to do the actual DNTT scanning and symtab building. */
375 install_minimal_symbols (objfile
);
377 /* Force hppa-tdep.c to re-read the unwind descriptors. */
378 objfile
->obj_private
= NULL
;
379 do_cleanups (back_to
);
382 /* Initialize anything that needs initializing when a completely new symbol
383 file is specified (not just adding some symbols from another file, e.g. a
386 We reinitialize buildsym, since we may be reading stabs from a SOM file. */
389 som_new_init (struct objfile
*ignore
)
391 stabsread_new_init ();
392 buildsym_new_init ();
395 /* Perform any local cleanups required when we are done with a particular
396 objfile. I.E, we are in the process of discarding all symbol information
397 for an objfile, freeing up all memory held for it, and unlinking the
398 objfile struct from the global list of known objfiles. */
401 som_symfile_finish (struct objfile
*objfile
)
403 if (objfile
->sym_stab_info
!= NULL
)
405 xmfree (objfile
->md
, objfile
->sym_stab_info
);
407 hpread_symfile_finish (objfile
);
410 /* SOM specific initialization routine for reading symbols. */
413 som_symfile_init (struct objfile
*objfile
)
415 /* SOM objects may be reordered, so set OBJF_REORDERED. If we
416 find this causes a significant slowdown in gdb then we could
417 set it in the debug symbol readers only when necessary. */
418 objfile
->flags
|= OBJF_REORDERED
;
419 hpread_symfile_init (objfile
);
422 /* SOM specific parsing routine for section offsets.
424 Plain and simple for now. */
427 som_symfile_offsets (struct objfile
*objfile
, struct section_addr_info
*addrs
)
432 objfile
->num_sections
= SECT_OFF_MAX
;
433 objfile
->section_offsets
= (struct section_offsets
*)
434 obstack_alloc (&objfile
->psymbol_obstack
, SIZEOF_SECTION_OFFSETS
);
436 /* FIXME: ezannoni 2000-04-20 The section names in SOM are not
437 .text, .data, etc, but $TEXT$, $DATA$,... We should initialize
438 SET_OFF_* from bfd. (See default_symfile_offsets()). But I don't
439 know the correspondence between SOM sections and GDB's idea of
440 section names. So for now we default to what is was before these
442 objfile
->sect_index_text
= 0;
443 objfile
->sect_index_data
= 1;
444 objfile
->sect_index_bss
= 2;
445 objfile
->sect_index_rodata
= 3;
447 /* First see if we're a shared library. If so, get the section
448 offsets from the library, else get them from addrs. */
449 if (!som_solib_section_offsets (objfile
, objfile
->section_offsets
))
451 /* Note: Here is OK to compare with ".text" because this is the
452 name that gdb itself gives to that section, not the SOM
454 for (i
= 0; i
< SECT_OFF_MAX
&& addrs
->other
[i
].name
; i
++)
455 if (strcmp (addrs
->other
[i
].name
, ".text") == 0)
457 text_addr
= addrs
->other
[i
].addr
;
459 for (i
= 0; i
< SECT_OFF_MAX
; i
++)
460 (objfile
->section_offsets
)->offsets
[i
] = text_addr
;
464 /* Read in and initialize the SOM import list which is present
465 for all executables and shared libraries. The import list
466 consists of the symbols that are referenced in OBJFILE but
467 not defined there. (Variables that are imported are dealt
468 with as "loc_indirect" vars.)
469 Return value = number of import symbols read in. */
471 init_import_symbols (struct objfile
*objfile
)
473 unsigned int import_list
;
474 unsigned int import_list_size
;
475 unsigned int string_table
;
476 unsigned int string_table_size
;
481 asection
*text_section
; /* section handle */
482 unsigned int dl_header
[12]; /* SOM executable header */
484 /* A struct for an entry in the SOM import list */
487 int name
; /* index into the string table */
488 short dont_care1
; /* we don't use this */
489 unsigned char type
; /* 0 = NULL, 2 = Data, 3 = Code, 7 = Storage, 13 = Plabel */
490 unsigned int reserved2
:8; /* not used */
494 /* We read 100 entries in at a time from the disk file. */
495 #define SOM_READ_IMPORTS_NUM 100
496 #define SOM_READ_IMPORTS_CHUNK_SIZE (sizeof (SomImportEntry) * SOM_READ_IMPORTS_NUM)
497 SomImportEntry buffer
[SOM_READ_IMPORTS_NUM
];
499 /* Initialize in case we error out */
500 objfile
->import_list
= NULL
;
501 objfile
->import_list_size
= 0;
503 /* It doesn't work, for some reason, to read in space $TEXT$;
504 the subspace $SHLIB_INFO$ has to be used. Some BFD quirk? pai/1997-08-05 */
505 text_section
= bfd_get_section_by_name (objfile
->obfd
, "$SHLIB_INFO$");
508 /* Get the SOM executable header */
509 bfd_get_section_contents (objfile
->obfd
, text_section
, dl_header
, 0, 12 * sizeof (int));
511 /* Check header version number for 10.x HP-UX */
512 /* Currently we deal only with 10.x systems; on 9.x the version # is 89060912.
513 FIXME: Change for future HP-UX releases and mods to the SOM executable format */
514 if (dl_header
[0] != 93092112)
517 import_list
= dl_header
[4];
518 import_list_size
= dl_header
[5];
519 if (!import_list_size
)
521 string_table
= dl_header
[10];
522 string_table_size
= dl_header
[11];
523 if (!string_table_size
)
526 /* Suck in SOM string table */
527 string_buffer
= (char *) xmalloc (string_table_size
);
528 bfd_get_section_contents (objfile
->obfd
, text_section
, string_buffer
,
529 string_table
, string_table_size
);
531 /* Allocate import list in the psymbol obstack; this has nothing
532 to do with psymbols, just a matter of convenience. We want the
533 import list to be freed when the objfile is deallocated */
535 = (ImportEntry
*) obstack_alloc (&objfile
->psymbol_obstack
,
536 import_list_size
* sizeof (ImportEntry
));
538 /* Read in the import entries, a bunch at a time */
540 j
< (import_list_size
/ SOM_READ_IMPORTS_NUM
);
543 bfd_get_section_contents (objfile
->obfd
, text_section
, buffer
,
544 import_list
+ j
* SOM_READ_IMPORTS_CHUNK_SIZE
,
545 SOM_READ_IMPORTS_CHUNK_SIZE
);
546 for (i
= 0; i
< SOM_READ_IMPORTS_NUM
; i
++, k
++)
548 if (buffer
[i
].type
!= (unsigned char) 0)
550 objfile
->import_list
[k
]
551 = (char *) obstack_alloc (&objfile
->psymbol_obstack
, strlen (string_buffer
+ buffer
[i
].name
) + 1);
552 strcpy (objfile
->import_list
[k
], string_buffer
+ buffer
[i
].name
);
553 /* Some day we might want to record the type and other information too */
556 objfile
->import_list
[k
] = NULL
;
561 /* Get the leftovers */
562 if (k
< import_list_size
)
563 bfd_get_section_contents (objfile
->obfd
, text_section
, buffer
,
564 import_list
+ k
* sizeof (SomImportEntry
),
565 (import_list_size
- k
) * sizeof (SomImportEntry
));
566 for (i
= 0; k
< import_list_size
; i
++, k
++)
568 if (buffer
[i
].type
!= (unsigned char) 0)
570 objfile
->import_list
[k
]
571 = (char *) obstack_alloc (&objfile
->psymbol_obstack
, strlen (string_buffer
+ buffer
[i
].name
) + 1);
572 strcpy (objfile
->import_list
[k
], string_buffer
+ buffer
[i
].name
);
573 /* Some day we might want to record the type and other information too */
576 objfile
->import_list
[k
] = NULL
;
579 objfile
->import_list_size
= import_list_size
;
580 xfree (string_buffer
);
581 return import_list_size
;
584 /* Read in and initialize the SOM export list which is present
585 for all executables and shared libraries. The import list
586 consists of the symbols that are referenced in OBJFILE but
587 not defined there. (Variables that are imported are dealt
588 with as "loc_indirect" vars.)
589 Return value = number of import symbols read in. */
591 init_export_symbols (struct objfile
*objfile
)
593 unsigned int export_list
;
594 unsigned int export_list_size
;
595 unsigned int string_table
;
596 unsigned int string_table_size
;
601 asection
*text_section
; /* section handle */
602 unsigned int dl_header
[12]; /* SOM executable header */
604 /* A struct for an entry in the SOM export list */
607 int next
; /* for hash table use -- we don't use this */
608 int name
; /* index into string table */
609 int value
; /* offset or plabel */
610 int dont_care1
; /* not used */
611 unsigned char type
; /* 0 = NULL, 2 = Data, 3 = Code, 7 = Storage, 13 = Plabel */
612 char dont_care2
; /* not used */
613 short dont_care3
; /* not used */
617 /* We read 100 entries in at a time from the disk file. */
618 #define SOM_READ_EXPORTS_NUM 100
619 #define SOM_READ_EXPORTS_CHUNK_SIZE (sizeof (SomExportEntry) * SOM_READ_EXPORTS_NUM)
620 SomExportEntry buffer
[SOM_READ_EXPORTS_NUM
];
622 /* Initialize in case we error out */
623 objfile
->export_list
= NULL
;
624 objfile
->export_list_size
= 0;
626 /* It doesn't work, for some reason, to read in space $TEXT$;
627 the subspace $SHLIB_INFO$ has to be used. Some BFD quirk? pai/1997-08-05 */
628 text_section
= bfd_get_section_by_name (objfile
->obfd
, "$SHLIB_INFO$");
631 /* Get the SOM executable header */
632 bfd_get_section_contents (objfile
->obfd
, text_section
, dl_header
, 0, 12 * sizeof (int));
634 /* Check header version number for 10.x HP-UX */
635 /* Currently we deal only with 10.x systems; on 9.x the version # is 89060912.
636 FIXME: Change for future HP-UX releases and mods to the SOM executable format */
637 if (dl_header
[0] != 93092112)
640 export_list
= dl_header
[8];
641 export_list_size
= dl_header
[9];
642 if (!export_list_size
)
644 string_table
= dl_header
[10];
645 string_table_size
= dl_header
[11];
646 if (!string_table_size
)
649 /* Suck in SOM string table */
650 string_buffer
= (char *) xmalloc (string_table_size
);
651 bfd_get_section_contents (objfile
->obfd
, text_section
, string_buffer
,
652 string_table
, string_table_size
);
654 /* Allocate export list in the psymbol obstack; this has nothing
655 to do with psymbols, just a matter of convenience. We want the
656 export list to be freed when the objfile is deallocated */
658 = (ExportEntry
*) obstack_alloc (&objfile
->psymbol_obstack
,
659 export_list_size
* sizeof (ExportEntry
));
661 /* Read in the export entries, a bunch at a time */
663 j
< (export_list_size
/ SOM_READ_EXPORTS_NUM
);
666 bfd_get_section_contents (objfile
->obfd
, text_section
, buffer
,
667 export_list
+ j
* SOM_READ_EXPORTS_CHUNK_SIZE
,
668 SOM_READ_EXPORTS_CHUNK_SIZE
);
669 for (i
= 0; i
< SOM_READ_EXPORTS_NUM
; i
++, k
++)
671 if (buffer
[i
].type
!= (unsigned char) 0)
673 objfile
->export_list
[k
].name
674 = (char *) obstack_alloc (&objfile
->psymbol_obstack
, strlen (string_buffer
+ buffer
[i
].name
) + 1);
675 strcpy (objfile
->export_list
[k
].name
, string_buffer
+ buffer
[i
].name
);
676 objfile
->export_list
[k
].address
= buffer
[i
].value
;
677 /* Some day we might want to record the type and other information too */
682 objfile
->export_list
[k
].name
= NULL
;
683 objfile
->export_list
[k
].address
= 0;
688 /* Get the leftovers */
689 if (k
< export_list_size
)
690 bfd_get_section_contents (objfile
->obfd
, text_section
, buffer
,
691 export_list
+ k
* sizeof (SomExportEntry
),
692 (export_list_size
- k
) * sizeof (SomExportEntry
));
693 for (i
= 0; k
< export_list_size
; i
++, k
++)
695 if (buffer
[i
].type
!= (unsigned char) 0)
697 objfile
->export_list
[k
].name
698 = (char *) obstack_alloc (&objfile
->psymbol_obstack
, strlen (string_buffer
+ buffer
[i
].name
) + 1);
699 strcpy (objfile
->export_list
[k
].name
, string_buffer
+ buffer
[i
].name
);
700 /* Some day we might want to record the type and other information too */
701 objfile
->export_list
[k
].address
= buffer
[i
].value
;
705 objfile
->export_list
[k
].name
= NULL
;
706 objfile
->export_list
[k
].address
= 0;
710 objfile
->export_list_size
= export_list_size
;
711 xfree (string_buffer
);
712 return export_list_size
;
717 /* Register that we are able to handle SOM object file formats. */
719 static struct sym_fns som_sym_fns
=
721 bfd_target_som_flavour
,
722 som_new_init
, /* sym_new_init: init anything gbl to entire symtab */
723 som_symfile_init
, /* sym_init: read initial info, setup for sym_read() */
724 som_symfile_read
, /* sym_read: read a symbol file into symtab */
725 som_symfile_finish
, /* sym_finish: finished with file, cleanup */
726 som_symfile_offsets
, /* sym_offsets: Translate ext. to int. relocation */
727 NULL
/* next: pointer to next struct sym_fns */
731 _initialize_somread (void)
733 add_symtab_fns (&som_sym_fns
);