* somread.c: Renamed from paread.c. Changed function names and
authorJeff Law <law@redhat.com>
Mon, 27 Jun 1994 06:09:40 +0000 (06:09 +0000)
committerJeff Law <law@redhat.com>
Mon, 27 Jun 1994 06:09:40 +0000 (06:09 +0000)
comments to reflect that this file deals with SOM (an object file
format), rather than the PA (a cpu).
(Makefile.in): Chaned appropriately.
(config/pa/hppabsd.mh, config/pa/hppahpux.mh): Likewise.
* dbxread.c (somstab_build_psymtabs): Renamed from
pastab_build_psymtabs.

gdb/.Sanitize
gdb/ChangeLog
gdb/ChangeLog.mpw
gdb/config/pa/hppabsd.mh
gdb/config/pa/hppahpux.mh
gdb/dbxread.c
gdb/mpw-make.in
gdb/paread.c
gdb/somread.c [new file with mode: 0644]

index c58b28d26dfd510f53b15a1279cbf97a9b6be880..5fd93f08eddd014c7da3f1a98fdbcd7a981a1e88 100644 (file)
@@ -215,7 +215,6 @@ objfiles.c
 objfiles.h
 os9kread.c
 osfsolib.c
-paread.c
 parse.c
 parser-defs.h
 partial-stab.h
@@ -261,6 +260,7 @@ sh-tdep.c
 signals.h
 solib.c
 solib.h
+somread.c
 source.c
 sp64-tdep.c
 sparc-nat.c
index 4f9740a3f84ec3b46c0846acf3ee225bf65440cc..3d7ff3856910dc60ff08dd7db5da7a33b4d8763a 100644 (file)
@@ -1,3 +1,13 @@
+Sun Jun 26 23:54:08 1994  Jeff Law  (law@snake.cs.utah.edu)
+
+       * somread.c: Renamed from paread.c.  Changed function names and
+       comments to reflect that this file deals with SOM (an object file
+       format), rather than the PA (a cpu).
+       (Makefile.in): Chaned appropriately.
+       (config/pa/hppabsd.mh, config/pa/hppahpux.mh): Likewise.
+       * dbxread.c (somstab_build_psymtabs): Renamed from
+       pastab_build_psymtabs.
+
 Fri Jun 24 08:15:42 1994  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
 
        * core-sol2.c:  New file to handle ELF and BCP core file flavours.
index 1e4c6ad03e405b7b2fad8d4b13512eacf85aa09d..9bb9ee8204129b5fd862c3b424de264c8a0558c7 100644 (file)
@@ -1,3 +1,7 @@
+Sun Jun 26 23:56:19 1994  Jeff Law  (law@snake.cs.utah.edu)
+
+       * mpw-make.in: Change references from paread.c to somread.c
+
 Wed Jun 22 11:10:27 1994  Stan Shebs  (shebs@andros.cygnus.com)
 
        * mpw-make.in (VERSION): Update to 4.12.3.
index 9f6c008530f450f49b2a2a8301d8092e3ae52c2c..bf26c41ceeeb093c80741f428cb06cdfee698287 100644 (file)
@@ -2,4 +2,4 @@
 XDEPFILES= 
 XM_FILE= xm-hppab.h
 NAT_FILE= nm-hppab.h
-NATDEPFILES= hppab-nat.o coredep.o corelow.o exec.o inftarg.o fork-child.o paread.o infptrace.o
+NATDEPFILES= hppab-nat.o coredep.o corelow.o exec.o inftarg.o fork-child.o somread.o infptrace.o
index 2c92c328b366d62b7cd40f3743fbb42ab429aa41..407733a1740cb710535ed2f945098aabf4b64ec3 100644 (file)
@@ -3,7 +3,7 @@ TERMCAP = -lcurses
 XDEPFILES= 
 XM_FILE= xm-hppah.h
 NAT_FILE= nm-hppah.h
-NATDEPFILES= hppah-nat.o coredep.o corelow.o inftarg.o fork-child.o paread.o infptrace.o
+NATDEPFILES= hppah-nat.o coredep.o corelow.o inftarg.o fork-child.o somread.o infptrace.o
 REGEX=regex.o
 REGEX1=regex.o
 HOST_IPC=-DBSD_IPC -DPOSIX_WAIT
index dd81a09eedd8be34ae8790b35be458c3769cdbf0..a77f646f107d1c9a60cb7e7416b55faa49d5b768 100644 (file)
@@ -144,6 +144,11 @@ static unsigned int next_file_string_table_offset;
    text addresses at location 0. */
 
 static int symfile_relocatable = 0;
+
+  /* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are relative
+     to the function start address.  */
+
+static int block_address_function_relative = 0;
 \f
 /* This is the lowest text address we have yet encountered.  */
 static CORE_ADDR lowest_text_address;
@@ -483,7 +488,7 @@ record_minimal_symbol (name, address, type, objfile)
       break;
   }
 
-  if (ms_type == mst_file_text || ms_type == mst_text
+  if ((ms_type == mst_file_text || ms_type == mst_text)
       && address < lowest_text_address)
     lowest_text_address = address;
 
@@ -528,6 +533,16 @@ dbx_symfile_read (objfile, section_offsets, mainline)
       || strcmp (&objfile->name[val-4], ".nlm") == 0)
     symfile_relocatable = 1;
 
+  /* This is true for Solaris (and all other systems which put stabs
+     in sections, hopefully, since it would be silly to do things
+     differently from Solaris), and false for SunOS4 and other a.out
+     file formats.  */
+  block_address_function_relative =
+    ((0 == strncmp (bfd_get_target (objfile->obfd), "elf", 3))
+     || (0 == strncmp (bfd_get_target (objfile->obfd), "som", 3))
+     || (0 == strncmp (bfd_get_target (objfile->obfd), "coff", 4))
+     || (0 == strncmp (bfd_get_target (objfile->obfd), "nlm", 3)));
+
   sym_bfd = objfile->obfd;
   val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
   if (val < 0)
@@ -1222,7 +1237,6 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
      int number_dependencies;
 {
   int i;
-  struct partial_symtab *p1;
   struct objfile *objfile = pst -> objfile;
 
   if (capping_symbol_offset != -1)
@@ -1307,6 +1321,8 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
      own ending address to our starting address, nor to set addresses on
      `dependency' files that have both textlow and texthigh zero.  */
   if (pst->textlow) {
+    struct partial_symtab *p1;
+
     ALL_OBJFILE_PSYMTABS (objfile, p1) {
       if (p1->texthigh == 0  && p1->textlow != 0 && p1 != pst) {
        p1->texthigh = pst->textlow;
@@ -1712,10 +1728,6 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
      used to relocate these symbol types rather than SECTION_OFFSETS.  */
   static CORE_ADDR function_start_offset;
 
-  /* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are relative
-     to the function start address.  */
-  int block_address_function_relative;
-
   /* If this is nonzero, we've seen a non-gcc N_OPT symbol for this source
      file.  Used to detect the SunPRO solaris compiler.  */
   static int n_opt_found;
@@ -1724,16 +1736,6 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
      N_STSYM or N_GSYM for SunOS4 acc; N_FUN for other compilers.  */
   static int function_stab_type = 0;
 
-  /* This is true for Solaris (and all other systems which put stabs
-     in sections, hopefully, since it would be silly to do things
-     differently from Solaris), and false for SunOS4 and other a.out
-     file formats.  */
-  block_address_function_relative =
-    ((0 == strncmp (bfd_get_target (objfile->obfd), "elf", 3))
-     || (0 == strncmp (bfd_get_target (objfile->obfd), "som", 3))
-     || (0 == strncmp (bfd_get_target (objfile->obfd), "coff", 4))
-     || (0 == strncmp (bfd_get_target (objfile->obfd), "nlm", 3)));
-
   if (!block_address_function_relative)
     /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
        function start address, so just use the text offset.  */
@@ -2379,7 +2381,7 @@ stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
     error ("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)",
           stab_name, stabstr_name);
 
-  DBX_SYMFILE_INFO (objfile) = (PTR) xmalloc (sizeof (struct dbx_symfile_info));
+  objfile->sym_stab_info = (PTR) xmalloc (sizeof (struct dbx_symfile_info));
   memset (DBX_SYMFILE_INFO (objfile), 0, sizeof (struct dbx_symfile_info));
 
   DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
@@ -2420,8 +2422,8 @@ stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
   dbx_symfile_read (objfile, section_offsets, 0);
 }
 \f
-/* Scan and build partial symbols for a PA symbol file.
-   This PA file has already been processed to get its minimal symbols.
+/* Scan and build partial symbols for a SOM symbol file.
+   This SOM file has already been processed to get its minimal symbols.
 
    OBJFILE is the object file we are reading symbols from.
    ADDR is the address relative to which the symbols are (e.g.
@@ -2432,7 +2434,7 @@ stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
    */
 
 void
-pastab_build_psymtabs (objfile, section_offsets, mainline)
+somstab_build_psymtabs (objfile, section_offsets, mainline)
      struct objfile *objfile;
      struct section_offsets *section_offsets;
      int mainline;
@@ -2443,8 +2445,8 @@ pastab_build_psymtabs (objfile, section_offsets, mainline)
   /* This is needed to debug objects assembled with gas2.  */
   processing_acc_compilation = 1;
 
-  /* In a PA file, we've already installed the minimal symbols that came
-     from the PA (non-stab) symbol table, so always act like an
+  /* In a SOM file, we've already installed the minimal symbols that came
+     from the SOM (non-stab) symbol table, so always act like an
      incremental load here. */
 
   dbx_symfile_read (objfile, section_offsets, mainline);
index 779bb8147d1926b9d74dae5f39f43a4a697eb99c..7bcfdb94848cf06a5d8e3e563fff6950ccb7f9df 100644 (file)
@@ -347,7 +347,7 @@ ALLDEPFILES = "{s}"29k-share:udi:udip2soc.c "{s}"29k-share:udi:udr.c \Option-d
        "{s}"nindy-share:Onindy.c "{s}"nindy-share:nindy.c \Option-d
        "{s}"nindy-share:ttyflush.c "{s}"nindy-tdep.c \Option-d
        "{s}"ns32k-pinsn.c "{s}"ns32km3-nat.c "{s}"osfsolib.c \Option-d
-       "{s}"paread.c "{s}"procfs.c "{s}"pyr-pinsn.c "{s}"pyr-tdep.c "{s}"pyr-xdep.c \Option-d
+       "{s}"somread.c "{s}"procfs.c "{s}"pyr-pinsn.c "{s}"pyr-tdep.c "{s}"pyr-xdep.c \Option-d
        "{s}"remote-adapt.c "{s}"remote-bug.c "{s}"remote-e7000.c "{s}"remote-eb.c "{s}"remote-es.c \Option-d
        "{s}"remote-hms.c "{s}"remote-mips.c \Option-d
        "{s}"remote-mm.c "{s}"remote-mon.c "{s}"remote-nindy.c "{s}"remote-sim.c \Option-d
@@ -1349,7 +1349,7 @@ MAKEOVERRIDES=
 "{o}"osfsolib.c.o \Option-f  "{s}"osfsolib.c {command_h} {defs_h} {gdbcore_h} {inferior_h} \Option-d
        "{s}"objfiles.h "{s}"regex.h "{s}"symfile.h "{s}"target.h "{s}"language.h
 
-"{o}"paread.c.o \Option-f  "{s}"paread.c {bfd_h} "{s}"buildsym.h "{s}"complaints.h {defs_h} \Option-d
+"{o}"somread.c.o \Option-f  "{s}"somread.c {bfd_h} "{s}"buildsym.h "{s}"complaints.h {defs_h} \Option-d
        "{s}"gdb-stabs.h "{s}"objfiles.h "{s}"symfile.h {symtab_h}
 
 "{o}"parse.c.o \Option-f  "{s}"parse.c {command_h} {defs_h} {expression_h} {frame_h} \Option-d
index 2acdccd8aa46c1ccb3ab6c1a81cf36fbfd16185b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,547 +0,0 @@
-/* Read HP PA/Risc object files for GDB.
-   Copyright 1991, 1992 Free Software Foundation, Inc.
-   Written by Fred Fish at Cygnus Support.
-
-This file is part of GDB.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-
-#include "defs.h"
-#include "bfd.h"
-#include <time.h> /* For time_t in libbfd.h.  */
-#include <sys/types.h> /* For time_t, if not in time.h.  */
-#include "libbfd.h"
-#include "som.h"
-#include "libhppa.h"
-#include <syms.h>
-#include "symtab.h"
-#include "symfile.h"
-#include "objfiles.h"
-#include "buildsym.h"
-#include "stabsread.h"
-#include "gdb-stabs.h"
-#include "complaints.h"
-#include <string.h>
-#include "demangle.h"
-#include <sys/file.h>
-
-/* Size of n_value and n_strx fields in a stab symbol.  */
-#define BYTES_IN_WORD 4
-
-#include "aout/aout64.h"
-
-/* Various things we might complain about... */
-
-static void
-pa_symfile_init PARAMS ((struct objfile *));
-
-static void
-pa_new_init PARAMS ((struct objfile *));
-
-static void
-pa_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
-
-static void
-pa_symfile_finish PARAMS ((struct objfile *));
-
-static void
-pa_symtab_read PARAMS ((bfd *,  CORE_ADDR, struct objfile *));
-
-static void
-free_painfo PARAMS ((PTR));
-
-static struct section_offsets *
-pa_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
-
-static void
-record_minimal_symbol PARAMS ((char *, CORE_ADDR,
-                              enum minimal_symbol_type,
-                              struct objfile *));
-
-static void
-record_minimal_symbol (name, address, ms_type, objfile)
-     char *name;
-     CORE_ADDR address;
-     enum minimal_symbol_type ms_type;
-     struct objfile *objfile;
-{
-  name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
-  prim_record_minimal_symbol (name, address, ms_type, objfile);
-}
-
-/*
-
-LOCAL FUNCTION
-
-       pa_symtab_read -- read the symbol table of a PA file
-
-SYNOPSIS
-
-       void pa_symtab_read (bfd *abfd, CORE_ADDR addr,
-                             struct objfile *objfile)
-
-DESCRIPTION
-
-       Given an open bfd, a base address to relocate symbols to, and a
-       flag that specifies whether or not this bfd is for an executable
-       or not (may be shared library for example), add all the global
-       function and data symbols to the minimal symbol table.
-*/
-
-static void
-pa_symtab_read (abfd, addr, objfile)
-     bfd *abfd;
-     CORE_ADDR addr;
-     struct objfile *objfile;
-{
-  unsigned int number_of_symbols;
-  unsigned int i;
-  int val, dynamic;
-  char *stringtab;
-  asection *shlib_info;
-  struct symbol_dictionary_record *buf, *bufp, *endbufp;
-  char *symname;
-  CONST int symsize = sizeof (struct symbol_dictionary_record);
-
-  number_of_symbols = bfd_get_symcount (abfd);
-
-  buf = alloca (symsize * number_of_symbols);
-  bfd_seek (abfd, obj_som_sym_filepos (abfd), L_SET);
-  val = bfd_read (buf, symsize * number_of_symbols, 1, abfd);
-  if (val != symsize * number_of_symbols)
-    error ("Couldn't read symbol dictionary!");
-
-  stringtab = alloca (obj_som_stringtab_size (abfd));
-  bfd_seek (abfd, obj_som_str_filepos (abfd), L_SET);
-  val = bfd_read (stringtab, obj_som_stringtab_size (abfd), 1, abfd);
-  if (val != obj_som_stringtab_size (abfd))
-    error ("Can't read in HP string table.");
-
-  /* We need to determine if objfile is a dynamic executable (so we
-     can do the right thing for ST_ENTRY vs ST_CODE symbols).
-
-     There's nothing in the header which easily allows us to do
-     this.  The only reliable way I know of is to check for the
-     existance of a $SHLIB_INFO$ section with a non-zero size.  */
-  shlib_info = bfd_get_section_by_name (objfile->obfd, "$SHLIB_INFO$");
-  if (shlib_info)
-    dynamic = (bfd_section_size (objfile->obfd, shlib_info) != 0);
-  else
-    dynamic = 0;
-
-  endbufp = buf + number_of_symbols;
-  for (bufp = buf; bufp < endbufp; ++bufp)
-    {
-      enum minimal_symbol_type ms_type;
-
-      QUIT;
-
-      switch (bufp->symbol_scope)
-       {
-       case SS_UNIVERSAL:
-       case SS_EXTERNAL:
-         switch (bufp->symbol_type)
-           {
-           case ST_SYM_EXT:
-           case ST_ARG_EXT:
-             continue;
-
-           case ST_CODE:
-           case ST_PRI_PROG:
-           case ST_SEC_PROG:
-           case ST_MILLICODE:
-             symname = bufp->name.n_strx + stringtab;
-             ms_type = mst_text;
-#ifdef SMASH_TEXT_ADDRESS
-             SMASH_TEXT_ADDRESS (bufp->symbol_value);
-#endif
-             break;
-
-           case ST_ENTRY:
-             symname = bufp->name.n_strx + stringtab;
-             /* For a dynamic executable, ST_ENTRY symbols are
-                the stubs, while the ST_CODE symbol is the real
-                function.  */
-             if (dynamic)
-               ms_type = mst_solib_trampoline;
-             else
-               ms_type = mst_text;
-#ifdef SMASH_TEXT_ADDRESS
-             SMASH_TEXT_ADDRESS (bufp->symbol_value);
-#endif
-             break;
-
-           case ST_STUB:
-             symname = bufp->name.n_strx + stringtab;
-             ms_type = mst_solib_trampoline;
-#ifdef SMASH_TEXT_ADDRESS
-             SMASH_TEXT_ADDRESS (bufp->symbol_value);
-#endif
-             break;
-
-           case ST_DATA:
-             symname = bufp->name.n_strx + stringtab;
-             ms_type = mst_data;
-             break;
-           default:
-             continue;
-           }
-         break;
-
-#if 0
-         /* SS_GLOBAL and SS_LOCAL are two names for the same thing (!).  */
-       case SS_GLOBAL:
-#endif
-       case SS_LOCAL:
-         switch (bufp->symbol_type)
-           {
-           case ST_SYM_EXT:
-           case ST_ARG_EXT:
-             continue;
-
-           case ST_CODE:
-             symname = bufp->name.n_strx + stringtab;
-             ms_type = mst_file_text;
-#ifdef SMASH_TEXT_ADDRESS
-             SMASH_TEXT_ADDRESS (bufp->symbol_value);
-#endif
-
-           check_strange_names:
-             /* Utah GCC 2.5, FSF GCC 2.6 and later generate correct local
-                label prefixes for stabs, constant data, etc.  So we need
-                only filter out L$ symbols which are left in due to
-                limitations in how GAS generates SOM relocations.
-
-                When linking in the HPUX C-library the HP linker has
-                the nasty habit of placing section symbols from the literal
-                subspaces in the middle of the program's text.  Filter
-                those out as best we can.  Check for first and last character
-                being '$'.  */
-             if ((symname[0] == 'L' && symname[1] == '$')
-                 || (symname[0] == '$' && symname[strlen(symname) - 1] == '$'))
-               continue;
-             break;
-
-           case ST_PRI_PROG:
-           case ST_SEC_PROG:
-           case ST_MILLICODE:
-             symname = bufp->name.n_strx + stringtab;
-             ms_type = mst_file_text;
-#ifdef SMASH_TEXT_ADDRESS
-             SMASH_TEXT_ADDRESS (bufp->symbol_value);
-#endif
-             break;
-
-           case ST_ENTRY:
-             symname = bufp->name.n_strx + stringtab;
-             /* For a dynamic executable, ST_ENTRY symbols are
-                the stubs, while the ST_CODE symbol is the real
-                function.  */
-             if (dynamic)
-               ms_type = mst_solib_trampoline;
-             else
-               ms_type = mst_file_text;
-#ifdef SMASH_TEXT_ADDRESS
-             SMASH_TEXT_ADDRESS (bufp->symbol_value);
-#endif
-             break;
-
-           case ST_STUB:
-             symname = bufp->name.n_strx + stringtab;
-             ms_type = mst_solib_trampoline;
-#ifdef SMASH_TEXT_ADDRESS
-             SMASH_TEXT_ADDRESS (bufp->symbol_value);
-#endif
-             break;
-
-
-           case ST_DATA:
-             symname = bufp->name.n_strx + stringtab;
-             ms_type = mst_file_data;
-             goto check_strange_names;
-
-           default:
-             continue;
-           }
-         break;
-
-       default:
-         continue;
-       }
-
-      if (bufp->name.n_strx > obj_som_stringtab_size (abfd))
-       error ("Invalid symbol data; bad HP string table offset: %d",
-              bufp->name.n_strx);
-
-      record_minimal_symbol (symname,
-                            bufp->symbol_value, ms_type, 
-                            objfile);
-    }
-
-  install_minimal_symbols (objfile);
-}
-
-/* Scan and build partial symbols for a symbol file.
-   We have been initialized by a call to pa_symfile_init, which 
-   currently does nothing.
-
-   SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
-   in each section.  This is ignored, as it isn't needed for the PA.
-
-   MAINLINE is true if we are reading the main symbol
-   table (as opposed to a shared lib or dynamically loaded file).
-
-   This function only does the minimum work necessary for letting the
-   user "name" things symbolically; it does not read the entire symtab.
-   Instead, it reads the external and static symbols and puts them in partial
-   symbol tables.  When more extensive information is requested of a
-   file, the corresponding partial symbol table is mutated into a full
-   fledged symbol table by going back and reading the symbols
-   for real.
-
-   We look for sections with specific names, to tell us what debug
-   format to look for:  FIXME!!!
-
-   pastab_build_psymtabs() handles STABS symbols.
-
-   Note that PA files have a "minimal" symbol table, which is vaguely
-   reminiscent of a COFF symbol table, but has only the minimal information
-   necessary for linking.  We process this also, and use the information to
-   build gdb's minimal symbol table.  This gives us some minimal debugging
-   capability even for files compiled without -g.  */
-
-static void
-pa_symfile_read (objfile, section_offsets, mainline)
-     struct objfile *objfile;
-     struct section_offsets *section_offsets;
-     int mainline;
-{
-  bfd *abfd = objfile->obfd;
-  struct cleanup *back_to;
-  CORE_ADDR offset;
-
-  init_minimal_symbol_collection ();
-  back_to = make_cleanup (discard_minimal_symbols, 0);
-
-  make_cleanup (free_painfo, (PTR) objfile);
-
-  /* Process the normal PA symbol table first. */
-
-  /* FIXME, should take a section_offsets param, not just an offset.  */
-
-  offset = ANOFFSET (section_offsets, 0);
-  pa_symtab_read (abfd, offset, objfile);
-
-  /* Now process debugging information, which is contained in
-     special PA sections.  */
-
-  pastab_build_psymtabs (objfile, section_offsets, mainline);
-
-  do_cleanups (back_to);
-}
-
-/* This cleans up the objfile's sym_stab_info pointer, and the chain of
-   stab_section_info's, that might be dangling from it.  */
-
-static void
-free_painfo (objp)
-     PTR objp;
-{
-  struct objfile *objfile = (struct objfile *)objp;
-  struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
-                                    objfile->sym_stab_info;
-  struct stab_section_info *ssi, *nssi;
-
-  ssi = dbxinfo->stab_section_info;
-  while (ssi)
-    {
-      nssi = ssi->next;
-      mfree (objfile->md, ssi);
-      ssi = nssi;
-    }
-
-  dbxinfo->stab_section_info = 0;      /* Just say No mo info about this.  */
-}
-
-/* Initialize anything that needs initializing when a completely new symbol
-   file is specified (not just adding some symbols from another file, e.g. a
-   shared library).
-
-   We reinitialize buildsym, since we may be reading stabs from a PA file.  */
-
-static void
-pa_new_init (ignore)
-     struct objfile *ignore;
-{
-  stabsread_new_init ();
-  buildsym_new_init ();
-}
-
-/* Perform any local cleanups required when we are done with a particular
-   objfile.  I.E, we are in the process of discarding all symbol information
-   for an objfile, freeing up all memory held for it, and unlinking the
-   objfile struct from the global list of known objfiles. */
-
-static void
-pa_symfile_finish (objfile)
-     struct objfile *objfile;
-{
-  if (objfile -> sym_stab_info != NULL)
-    {
-      mfree (objfile -> md, objfile -> sym_stab_info);
-    }
-}
-
-/* PA specific initialization routine for reading symbols.
-
-   It is passed a pointer to a struct sym_fns which contains, among other
-   things, the BFD for the file whose symbols are being read, and a slot for
-   a pointer to "private data" which we can fill with goodies.
-
-   This routine is almost a complete ripoff of dbx_symfile_init.  The
-   common parts of these routines should be extracted and used instead of
-   duplicating this code.  FIXME. */
-
-static void
-pa_symfile_init (objfile)
-     struct objfile *objfile;
-{
-  int val;
-  bfd *sym_bfd = objfile->obfd;
-  char *name = bfd_get_filename (sym_bfd);
-  asection *stabsect;          /* Section containing symbol table entries */
-  asection *stringsect;                /* Section containing symbol name strings */
-
-  stabsect = bfd_get_section_by_name (sym_bfd, "$GDB_SYMBOLS$");
-  stringsect = bfd_get_section_by_name (sym_bfd, "$GDB_STRINGS$");
-
-  /* Allocate struct to keep track of the symfile */
-  objfile->sym_stab_info = (PTR)
-    xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
-
-  memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
-
-
-  /* FIXME POKING INSIDE BFD DATA STRUCTURES */
-#define        STRING_TABLE_OFFSET     (stringsect->filepos)
-#define        SYMBOL_TABLE_OFFSET     (stabsect->filepos)
-
-  /* FIXME POKING INSIDE BFD DATA STRUCTURES */
-
-  DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
-  DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, "$TEXT$");
-  if (!DBX_TEXT_SECT (objfile))
-    error ("Can't find $TEXT$ section in symbol file");
-
-  if (!stabsect)
-    return;
-
-  if (!stringsect)
-    error ("Found stabs, but not string section");
-  
-  /* FIXME: I suspect this should be external_nlist.  The size of host
-     types like long and bfd_vma should not affect how we read the
-     file.  */
-  DBX_SYMBOL_SIZE (objfile) = sizeof (struct internal_nlist);
-  DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
-    / DBX_SYMBOL_SIZE (objfile);
-  DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
-
-  /* Read the string table and stash it away in the psymbol_obstack.  It is
-     only needed as long as we need to expand psymbols into full symbols,
-     so when we blow away the psymbol the string table goes away as well.
-     Note that gdb used to use the results of attempting to malloc the
-     string table, based on the size it read, as a form of sanity check
-     for botched byte swapping, on the theory that a byte swapped string
-     table size would be so totally bogus that the malloc would fail.  Now
-     that we put in on the psymbol_obstack, we can't do this since gdb gets
-     a fatal error (out of virtual memory) if the size is bogus.  We can
-     however at least check to see if the size is zero or some negative
-     value. */
-
-  DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stringsect);
-
-  if (DBX_SYMCOUNT (objfile) == 0
-      || DBX_STRINGTAB_SIZE (objfile) == 0)
-    return;
-
-  if (DBX_STRINGTAB_SIZE (objfile) <= 0
-      || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
-    error ("ridiculous string table size (%d bytes).",
-          DBX_STRINGTAB_SIZE (objfile));
-
-  DBX_STRINGTAB (objfile) =
-    (char *) obstack_alloc (&objfile -> psymbol_obstack,
-                           DBX_STRINGTAB_SIZE (objfile));
-
-  /* Now read in the string table in one big gulp.  */
-
-  val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
-  if (val < 0)
-    perror_with_name (name);
-  val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
-                 sym_bfd);
-  if (val == 0)
-    error ("End of file reading string table");
-  else if (val < 0)
-    /* It's possible bfd_read should be setting bfd_error, and we should be
-       checking that.  But currently it doesn't set bfd_error.  */
-    perror_with_name (name);
-  else if (val != DBX_STRINGTAB_SIZE (objfile))
-    error ("Short read reading string table");
-}
-
-/* PA specific parsing routine for section offsets.
-
-   Plain and simple for now.  */
-
-static struct section_offsets *
-pa_symfile_offsets (objfile, addr)
-     struct objfile *objfile;
-     CORE_ADDR addr;
-{
-  struct section_offsets *section_offsets;
-  int i;
-
-  objfile->num_sections = SECT_OFF_MAX;
-  section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets)
-                  + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
-
-  for (i = 0; i < SECT_OFF_MAX; i++)
-    ANOFFSET (section_offsets, i) = addr;
-
-  return section_offsets;
-}
-\f
-/* Register that we are able to handle SOM object file formats.  */
-
-static struct sym_fns pa_sym_fns =
-{
-  bfd_target_som_flavour,
-  pa_new_init,         /* sym_new_init: init anything gbl to entire symtab */
-  pa_symfile_init,     /* sym_init: read initial info, setup for sym_read() */
-  pa_symfile_read,     /* sym_read: read a symbol file into symtab */
-  pa_symfile_finish,   /* sym_finish: finished with file, cleanup */
-  pa_symfile_offsets,  /* sym_offsets:  Translate ext. to int. relocation */
-  NULL                 /* next: pointer to next struct sym_fns */
-};
-
-void
-_initialize_paread ()
-{
-  add_symtab_fns (&pa_sym_fns);
-}
diff --git a/gdb/somread.c b/gdb/somread.c
new file mode 100644 (file)
index 0000000..89a5c08
--- /dev/null
@@ -0,0 +1,547 @@
+/* Read HP PA/Risc object files for GDB.
+   Copyright 1991, 1992 Free Software Foundation, Inc.
+   Written by Fred Fish at Cygnus Support.
+
+This file is part of GDB.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#include "defs.h"
+#include "bfd.h"
+#include <time.h> /* For time_t in libbfd.h.  */
+#include <sys/types.h> /* For time_t, if not in time.h.  */
+#include "libbfd.h"
+#include "som.h"
+#include "libhppa.h"
+#include <syms.h>
+#include "symtab.h"
+#include "symfile.h"
+#include "objfiles.h"
+#include "buildsym.h"
+#include "stabsread.h"
+#include "gdb-stabs.h"
+#include "complaints.h"
+#include <string.h>
+#include "demangle.h"
+#include <sys/file.h>
+
+/* Size of n_value and n_strx fields in a stab symbol.  */
+#define BYTES_IN_WORD 4
+
+#include "aout/aout64.h"
+
+/* Various things we might complain about... */
+
+static void
+som__symfile_init PARAMS ((struct objfile *));
+
+static void
+som_new_init PARAMS ((struct objfile *));
+
+static void
+som_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
+
+static void
+som_symfile_finish PARAMS ((struct objfile *));
+
+static void
+som_symtab_read PARAMS ((bfd *,  CORE_ADDR, struct objfile *));
+
+static void
+free_sominfo PARAMS ((PTR));
+
+static struct section_offsets *
+som_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
+
+static void
+record_minimal_symbol PARAMS ((char *, CORE_ADDR,
+                              enum minimal_symbol_type,
+                              struct objfile *));
+
+static void
+record_minimal_symbol (name, address, ms_type, objfile)
+     char *name;
+     CORE_ADDR address;
+     enum minimal_symbol_type ms_type;
+     struct objfile *objfile;
+{
+  name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
+  prim_record_minimal_symbol (name, address, ms_type, objfile);
+}
+
+/*
+
+LOCAL FUNCTION
+
+       som_symtab_read -- read the symbol table of a SOM file
+
+SYNOPSIS
+
+       void som_symtab_read (bfd *abfd, CORE_ADDR addr,
+                             struct objfile *objfile)
+
+DESCRIPTION
+
+       Given an open bfd, a base address to relocate symbols to, and a
+       flag that specifies whether or not this bfd is for an executable
+       or not (may be shared library for example), add all the global
+       function and data symbols to the minimal symbol table.
+*/
+
+static void
+som_symtab_read (abfd, addr, objfile)
+     bfd *abfd;
+     CORE_ADDR addr;
+     struct objfile *objfile;
+{
+  unsigned int number_of_symbols;
+  unsigned int i;
+  int val, dynamic;
+  char *stringtab;
+  asection *shlib_info;
+  struct symbol_dictionary_record *buf, *bufp, *endbufp;
+  char *symname;
+  CONST int symsize = sizeof (struct symbol_dictionary_record);
+
+  number_of_symbols = bfd_get_symcount (abfd);
+
+  buf = alloca (symsize * number_of_symbols);
+  bfd_seek (abfd, obj_som_sym_filepos (abfd), L_SET);
+  val = bfd_read (buf, symsize * number_of_symbols, 1, abfd);
+  if (val != symsize * number_of_symbols)
+    error ("Couldn't read symbol dictionary!");
+
+  stringtab = alloca (obj_som_stringtab_size (abfd));
+  bfd_seek (abfd, obj_som_str_filepos (abfd), L_SET);
+  val = bfd_read (stringtab, obj_som_stringtab_size (abfd), 1, abfd);
+  if (val != obj_som_stringtab_size (abfd))
+    error ("Can't read in HP string table.");
+
+  /* We need to determine if objfile is a dynamic executable (so we
+     can do the right thing for ST_ENTRY vs ST_CODE symbols).
+
+     There's nothing in the header which easily allows us to do
+     this.  The only reliable way I know of is to check for the
+     existance of a $SHLIB_INFO$ section with a non-zero size.  */
+  shlib_info = bfd_get_section_by_name (objfile->obfd, "$SHLIB_INFO$");
+  if (shlib_info)
+    dynamic = (bfd_section_size (objfile->obfd, shlib_info) != 0);
+  else
+    dynamic = 0;
+
+  endbufp = buf + number_of_symbols;
+  for (bufp = buf; bufp < endbufp; ++bufp)
+    {
+      enum minimal_symbol_type ms_type;
+
+      QUIT;
+
+      switch (bufp->symbol_scope)
+       {
+       case SS_UNIVERSAL:
+       case SS_EXTERNAL:
+         switch (bufp->symbol_type)
+           {
+           case ST_SYM_EXT:
+           case ST_ARG_EXT:
+             continue;
+
+           case ST_CODE:
+           case ST_PRI_PROG:
+           case ST_SEC_PROG:
+           case ST_MILLICODE:
+             symname = bufp->name.n_strx + stringtab;
+             ms_type = mst_text;
+#ifdef SMASH_TEXT_ADDRESS
+             SMASH_TEXT_ADDRESS (bufp->symbol_value);
+#endif
+             break;
+
+           case ST_ENTRY:
+             symname = bufp->name.n_strx + stringtab;
+             /* For a dynamic executable, ST_ENTRY symbols are
+                the stubs, while the ST_CODE symbol is the real
+                function.  */
+             if (dynamic)
+               ms_type = mst_solib_trampoline;
+             else
+               ms_type = mst_text;
+#ifdef SMASH_TEXT_ADDRESS
+             SMASH_TEXT_ADDRESS (bufp->symbol_value);
+#endif
+             break;
+
+           case ST_STUB:
+             symname = bufp->name.n_strx + stringtab;
+             ms_type = mst_solib_trampoline;
+#ifdef SMASH_TEXT_ADDRESS
+             SMASH_TEXT_ADDRESS (bufp->symbol_value);
+#endif
+             break;
+
+           case ST_DATA:
+             symname = bufp->name.n_strx + stringtab;
+             ms_type = mst_data;
+             break;
+           default:
+             continue;
+           }
+         break;
+
+#if 0
+         /* SS_GLOBAL and SS_LOCAL are two names for the same thing (!).  */
+       case SS_GLOBAL:
+#endif
+       case SS_LOCAL:
+         switch (bufp->symbol_type)
+           {
+           case ST_SYM_EXT:
+           case ST_ARG_EXT:
+             continue;
+
+           case ST_CODE:
+             symname = bufp->name.n_strx + stringtab;
+             ms_type = mst_file_text;
+#ifdef SMASH_TEXT_ADDRESS
+             SMASH_TEXT_ADDRESS (bufp->symbol_value);
+#endif
+
+           check_strange_names:
+             /* Utah GCC 2.5, FSF GCC 2.6 and later generate correct local
+                label prefixes for stabs, constant data, etc.  So we need
+                only filter out L$ symbols which are left in due to
+                limitations in how GAS generates SOM relocations.
+
+                When linking in the HPUX C-library the HP linker has
+                the nasty habit of placing section symbols from the literal
+                subspaces in the middle of the program's text.  Filter
+                those out as best we can.  Check for first and last character
+                being '$'.  */
+             if ((symname[0] == 'L' && symname[1] == '$')
+                 || (symname[0] == '$' && symname[strlen(symname) - 1] == '$'))
+               continue;
+             break;
+
+           case ST_PRI_PROG:
+           case ST_SEC_PROG:
+           case ST_MILLICODE:
+             symname = bufp->name.n_strx + stringtab;
+             ms_type = mst_file_text;
+#ifdef SMASH_TEXT_ADDRESS
+             SMASH_TEXT_ADDRESS (bufp->symbol_value);
+#endif
+             break;
+
+           case ST_ENTRY:
+             symname = bufp->name.n_strx + stringtab;
+             /* For a dynamic executable, ST_ENTRY symbols are
+                the stubs, while the ST_CODE symbol is the real
+                function.  */
+             if (dynamic)
+               ms_type = mst_solib_trampoline;
+             else
+               ms_type = mst_file_text;
+#ifdef SMASH_TEXT_ADDRESS
+             SMASH_TEXT_ADDRESS (bufp->symbol_value);
+#endif
+             break;
+
+           case ST_STUB:
+             symname = bufp->name.n_strx + stringtab;
+             ms_type = mst_solib_trampoline;
+#ifdef SMASH_TEXT_ADDRESS
+             SMASH_TEXT_ADDRESS (bufp->symbol_value);
+#endif
+             break;
+
+
+           case ST_DATA:
+             symname = bufp->name.n_strx + stringtab;
+             ms_type = mst_file_data;
+             goto check_strange_names;
+
+           default:
+             continue;
+           }
+         break;
+
+       default:
+         continue;
+       }
+
+      if (bufp->name.n_strx > obj_som_stringtab_size (abfd))
+       error ("Invalid symbol data; bad HP string table offset: %d",
+              bufp->name.n_strx);
+
+      record_minimal_symbol (symname,
+                            bufp->symbol_value, ms_type, 
+                            objfile);
+    }
+
+  install_minimal_symbols (objfile);
+}
+
+/* Scan and build partial symbols for a symbol file.
+   We have been initialized by a call to som_symfile_init, which 
+   currently does nothing.
+
+   SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
+   in each section.  This is ignored, as it isn't needed for SOM.
+
+   MAINLINE is true if we are reading the main symbol
+   table (as opposed to a shared lib or dynamically loaded file).
+
+   This function only does the minimum work necessary for letting the
+   user "name" things symbolically; it does not read the entire symtab.
+   Instead, it reads the external and static symbols and puts them in partial
+   symbol tables.  When more extensive information is requested of a
+   file, the corresponding partial symbol table is mutated into a full
+   fledged symbol table by going back and reading the symbols
+   for real.
+
+   We look for sections with specific names, to tell us what debug
+   format to look for:  FIXME!!!
+
+   somstab_build_psymtabs() handles STABS symbols.
+
+   Note that SOM files have a "minimal" symbol table, which is vaguely
+   reminiscent of a COFF symbol table, but has only the minimal information
+   necessary for linking.  We process this also, and use the information to
+   build gdb's minimal symbol table.  This gives us some minimal debugging
+   capability even for files compiled without -g.  */
+
+static void
+som_symfile_read (objfile, section_offsets, mainline)
+     struct objfile *objfile;
+     struct section_offsets *section_offsets;
+     int mainline;
+{
+  bfd *abfd = objfile->obfd;
+  struct cleanup *back_to;
+  CORE_ADDR offset;
+
+  init_minimal_symbol_collection ();
+  back_to = make_cleanup (discard_minimal_symbols, 0);
+
+  make_cleanup (free_sominfo, (PTR) objfile);
+
+  /* Process the normal SOM symbol table first. */
+
+  /* FIXME, should take a section_offsets param, not just an offset.  */
+
+  offset = ANOFFSET (section_offsets, 0);
+  som_symtab_read (abfd, offset, objfile);
+
+  /* Now process debugging information, which is contained in
+     special SOM sections.  */
+
+  somstab_build_psymtabs (objfile, section_offsets, mainline);
+
+  do_cleanups (back_to);
+}
+
+/* This cleans up the objfile's sym_stab_info pointer, and the chain of
+   stab_section_info's, that might be dangling from it.  */
+
+static void
+free_sominfo (objp)
+     PTR objp;
+{
+  struct objfile *objfile = (struct objfile *)objp;
+  struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
+                                    objfile->sym_stab_info;
+  struct stab_section_info *ssi, *nssi;
+
+  ssi = dbxinfo->stab_section_info;
+  while (ssi)
+    {
+      nssi = ssi->next;
+      mfree (objfile->md, ssi);
+      ssi = nssi;
+    }
+
+  dbxinfo->stab_section_info = 0;      /* Just say No mo info about this.  */
+}
+
+/* Initialize anything that needs initializing when a completely new symbol
+   file is specified (not just adding some symbols from another file, e.g. a
+   shared library).
+
+   We reinitialize buildsym, since we may be reading stabs from a SOM file.  */
+
+static void
+som_new_init (ignore)
+     struct objfile *ignore;
+{
+  stabsread_new_init ();
+  buildsym_new_init ();
+}
+
+/* Perform any local cleanups required when we are done with a particular
+   objfile.  I.E, we are in the process of discarding all symbol information
+   for an objfile, freeing up all memory held for it, and unlinking the
+   objfile struct from the global list of known objfiles. */
+
+static void
+som_symfile_finish (objfile)
+     struct objfile *objfile;
+{
+  if (objfile -> sym_stab_info != NULL)
+    {
+      mfree (objfile -> md, objfile -> sym_stab_info);
+    }
+}
+
+/* SOM specific initialization routine for reading symbols.
+
+   It is passed a pointer to a struct sym_fns which contains, among other
+   things, the BFD for the file whose symbols are being read, and a slot for
+   a pointer to "private data" which we can fill with goodies.
+
+   This routine is almost a complete ripoff of dbx_symfile_init.  The
+   common parts of these routines should be extracted and used instead of
+   duplicating this code.  FIXME. */
+
+static void
+som_symfile_init (objfile)
+     struct objfile *objfile;
+{
+  int val;
+  bfd *sym_bfd = objfile->obfd;
+  char *name = bfd_get_filename (sym_bfd);
+  asection *stabsect;          /* Section containing symbol table entries */
+  asection *stringsect;                /* Section containing symbol name strings */
+
+  stabsect = bfd_get_section_by_name (sym_bfd, "$GDB_SYMBOLS$");
+  stringsect = bfd_get_section_by_name (sym_bfd, "$GDB_STRINGS$");
+
+  /* Allocate struct to keep track of the symfile */
+  objfile->sym_stab_info = (PTR)
+    xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
+
+  memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
+
+
+  /* FIXME POKING INSIDE BFD DATA STRUCTURES */
+#define        STRING_TABLE_OFFSET     (stringsect->filepos)
+#define        SYMBOL_TABLE_OFFSET     (stabsect->filepos)
+
+  /* FIXME POKING INSIDE BFD DATA STRUCTURES */
+
+  DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
+  DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, "$TEXT$");
+  if (!DBX_TEXT_SECT (objfile))
+    error ("Can't find $TEXT$ section in symbol file");
+
+  if (!stabsect)
+    return;
+
+  if (!stringsect)
+    error ("Found stabs, but not string section");
+  
+  /* FIXME: I suspect this should be external_nlist.  The size of host
+     types like long and bfd_vma should not affect how we read the
+     file.  */
+  DBX_SYMBOL_SIZE (objfile) = sizeof (struct internal_nlist);
+  DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
+    / DBX_SYMBOL_SIZE (objfile);
+  DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
+
+  /* Read the string table and stash it away in the psymbol_obstack.  It is
+     only needed as long as we need to expand psymbols into full symbols,
+     so when we blow away the psymbol the string table goes away as well.
+     Note that gdb used to use the results of attempting to malloc the
+     string table, based on the size it read, as a form of sanity check
+     for botched byte swapping, on the theory that a byte swapped string
+     table size would be so totally bogus that the malloc would fail.  Now
+     that we put in on the psymbol_obstack, we can't do this since gdb gets
+     a fatal error (out of virtual memory) if the size is bogus.  We can
+     however at least check to see if the size is zero or some negative
+     value. */
+
+  DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stringsect);
+
+  if (DBX_SYMCOUNT (objfile) == 0
+      || DBX_STRINGTAB_SIZE (objfile) == 0)
+    return;
+
+  if (DBX_STRINGTAB_SIZE (objfile) <= 0
+      || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
+    error ("ridiculous string table size (%d bytes).",
+          DBX_STRINGTAB_SIZE (objfile));
+
+  DBX_STRINGTAB (objfile) =
+    (char *) obstack_alloc (&objfile -> psymbol_obstack,
+                           DBX_STRINGTAB_SIZE (objfile));
+
+  /* Now read in the string table in one big gulp.  */
+
+  val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
+  if (val < 0)
+    perror_with_name (name);
+  val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
+                 sym_bfd);
+  if (val == 0)
+    error ("End of file reading string table");
+  else if (val < 0)
+    /* It's possible bfd_read should be setting bfd_error, and we should be
+       checking that.  But currently it doesn't set bfd_error.  */
+    perror_with_name (name);
+  else if (val != DBX_STRINGTAB_SIZE (objfile))
+    error ("Short read reading string table");
+}
+
+/* SOM specific parsing routine for section offsets.
+
+   Plain and simple for now.  */
+
+static struct section_offsets *
+som_symfile_offsets (objfile, addr)
+     struct objfile *objfile;
+     CORE_ADDR addr;
+{
+  struct section_offsets *section_offsets;
+  int i;
+
+  objfile->num_sections = SECT_OFF_MAX;
+  section_offsets = (struct section_offsets *)
+    obstack_alloc (&objfile -> psymbol_obstack,
+                  sizeof (struct section_offsets)
+                  + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
+
+  for (i = 0; i < SECT_OFF_MAX; i++)
+    ANOFFSET (section_offsets, i) = addr;
+
+  return section_offsets;
+}
+\f
+/* Register that we are able to handle SOM object file formats.  */
+
+static struct sym_fns som_sym_fns =
+{
+  bfd_target_som_flavour,
+  som_new_init,                /* sym_new_init: init anything gbl to entire symtab */
+  som_symfile_init,    /* sym_init: read initial info, setup for sym_read() */
+  som_symfile_read,    /* sym_read: read a symbol file into symtab */
+  som_symfile_finish,  /* sym_finish: finished with file, cleanup */
+  som_symfile_offsets, /* sym_offsets:  Translate ext. to int. relocation */
+  NULL                 /* next: pointer to next struct sym_fns */
+};
+
+void
+_initialize_somread ()
+{
+  add_symtab_fns (&som_sym_fns);
+}