* dbxread.c (record_minimal_symbol): Record the section
authorStu Grossman <grossman@cygnus>
Tue, 26 Apr 1994 17:14:52 +0000 (17:14 +0000)
committerStu Grossman <grossman@cygnus>
Tue, 26 Apr 1994 17:14:52 +0000 (17:14 +0000)
associated with the symbol to make dynmaic relocation work.
* (dbx_symfile_read, process_one_symbol):  Fixes to work around
Solaris brain-damage which don't apply to relocatable object
files.
* (stabsect_build_psymtabs):  New routine to read stabs out of an
arbitrarily named section.
* nlmread.c (nlm_symtab_read):  Read ALL syms from the NLM, not just
globals.
* (nlm_symfile_read):  Call stabsect_build_psymtabs to read the
stabs out of the nlm.
* partial-stabs.h (cases 'f' & 'F'):  Fixes to work around Solaris
brain-damage which don't apply to relocatable object files.
* remote.c (putpkt):  Improve error reporting and error handling.
* stabsread.c (define_symbol, scan_file_globals):  Record section
info in sym.

gdb/ChangeLog
gdb/dbxread.c
gdb/nlmread.c
gdb/partial-stab.h
gdb/stabsread.c

index 47cde9795013837dc572d3564b09544aba903d08..43e32c6fe62d1c60933cf0cd9cb664b64584da34 100644 (file)
@@ -1,3 +1,22 @@
+Tue Apr 26 09:50:45 1994  Stu Grossman  (grossman at cygnus.com)
+
+       * dbxread.c (record_minimal_symbol):  Record the section
+       associated with the symbol to make dynmaic relocation work.
+       * (dbx_symfile_read, process_one_symbol):  Fixes to work around
+       Solaris brain-damage which don't apply to relocatable object
+       files.
+       * (stabsect_build_psymtabs):  New routine to read stabs out of an
+       arbitrarily named section.
+       * nlmread.c (nlm_symtab_read):  Read ALL syms from the NLM, not just
+       globals.
+       * (nlm_symfile_read):  Call stabsect_build_psymtabs to read the
+       stabs out of the nlm.
+       * partial-stabs.h (cases 'f' & 'F'):  Fixes to work around Solaris
+       brain-damage which don't apply to relocatable object files.
+       * remote.c (putpkt):  Improve error reporting and error handling.
+       * stabsread.c (define_symbol, scan_file_globals):  Record section
+       info in sym.
+
 Sat Apr 23 19:05:52 1994  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
        * breakpoint.c (breakpoint_1): Annotate each field of output.  Add
index 5aa731266be27b3ffcc45fd799c597fe63199b0b..dd81a09eedd8be34ae8790b35be458c3769cdbf0 100644 (file)
@@ -138,6 +138,12 @@ static unsigned string_table_offset;
    offset for the current and next .o files. */
 static unsigned int file_string_table_offset;
 static unsigned int next_file_string_table_offset;
+
+/* .o and NLM files contain unrelocated addresses which are based at 0.  When
+   non-zero, this flag disables some of the special cases for Solaris elf+stab
+   text addresses at location 0. */
+
+static int symfile_relocatable = 0;
 \f
 /* This is the lowest text address we have yet encountered.  */
 static CORE_ADDR lowest_text_address;
@@ -407,20 +413,37 @@ record_minimal_symbol (name, address, type, objfile)
      struct objfile *objfile;
 {
   enum minimal_symbol_type ms_type;
+  int section;
 
   switch (type)
     {
-    case N_TEXT | N_EXT:  ms_type = mst_text; break;
-    case N_DATA | N_EXT:  ms_type = mst_data; break;
-    case N_BSS | N_EXT:   ms_type = mst_bss;  break;
-    case N_ABS | N_EXT:   ms_type = mst_abs;  break;
+    case N_TEXT | N_EXT:
+      ms_type = mst_text;
+      section = SECT_OFF_TEXT;
+      break;
+    case N_DATA | N_EXT:
+      ms_type = mst_data;
+      section = SECT_OFF_DATA;
+      break;
+    case N_BSS | N_EXT:
+      ms_type = mst_bss;
+      section = SECT_OFF_BSS;
+      break;
+    case N_ABS | N_EXT:
+      ms_type = mst_abs;
+      section = -1;
+      break;
 #ifdef N_SETV
-    case N_SETV | N_EXT:  ms_type = mst_data; break;
+    case N_SETV | N_EXT:
+      ms_type = mst_data;
+      section = SECT_OFF_DATA;
+      break;
     case N_SETV:
       /* I don't think this type actually exists; since a N_SETV is the result
         of going over many .o files, it doesn't make sense to have one
         file local.  */
       ms_type = mst_file_data;
+      section = SECT_OFF_DATA;
       break;
 #endif
     case N_TEXT:
@@ -428,8 +451,8 @@ record_minimal_symbol (name, address, type, objfile)
     case N_FN:
     case N_FN_SEQ:
       ms_type = mst_file_text;
+      section = SECT_OFF_TEXT;
       break;
-
     case N_DATA:
       ms_type = mst_file_data;
 
@@ -448,23 +471,28 @@ record_minimal_symbol (name, address, type, objfile)
        if (VTBL_PREFIX_P ((tempstring)))
          ms_type = mst_data;
       }
+      section = SECT_OFF_DATA;
       break;
-
     case N_BSS:
       ms_type = mst_file_bss;
+      section = SECT_OFF_BSS;
+      break;
+    default:
+      ms_type = mst_unknown;
+      section = -1;
       break;
-
-    default:      ms_type = mst_unknown; break;
   }
 
   if (ms_type == mst_file_text || ms_type == mst_text
       && address < lowest_text_address)
     lowest_text_address = address;
 
-  prim_record_minimal_symbol
+  prim_record_minimal_symbol_and_info
     (obsavestring (name, strlen (name), &objfile -> symbol_obstack),
      address,
      ms_type,
+     NULL,
+     section,
      objfile);
 }
 \f
@@ -488,6 +516,18 @@ dbx_symfile_read (objfile, section_offsets, mainline)
   int val;
   struct cleanup *back_to;
 
+  val = strlen (objfile->name);
+
+  /* .o and .nlm files are relocatables with text, data and bss segs based at
+     0.  This flag disables special (Solaris stabs-in-elf only) fixups for
+     symbols with a value of 0.  XXX - This is a Krock.  Solaris stabs-in-elf
+     should be fixed to determine pst->textlow without using this text seg of
+     0 fixup crap. */
+
+  if (strcmp (&objfile->name[val-2], ".o") == 0
+      || strcmp (&objfile->name[val-4], ".nlm") == 0)
+    symfile_relocatable = 1;
+
   sym_bfd = objfile->obfd;
   val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
   if (val < 0)
@@ -1691,7 +1731,8 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
   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), "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
@@ -1926,21 +1967,30 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
        call level, which we really don't want to do).  */
       {
        char *p;
-       p = strchr (name, ':');
-       if (p != 0 && p[1] == 'S')
+
+       /* .o files and NLMs have non-zero text seg offsets, but don't need
+          their static syms offset in this fashion.  XXX - This is really a
+          crock that should be fixed in the solib handling code so that I
+          don't have to work around it here. */
+
+       if (!symfile_relocatable)
          {
-           /* The linker relocated it.  We don't want to add an
-              elfstab_offset_sections-type offset, but we *do* want
-              to add whatever solib.c passed to symbol_file_add as
-              addr (this is known to affect SunOS4, and I suspect ELF
-              too).  Since elfstab_offset_sections currently does not
-              muck with the text offset (there is no Ttext.text
-              symbol), we can get addr from the text offset.  If
-              elfstab_offset_sections ever starts dealing with the
-              text offset, and we still need to do this, we need to
-              invent a SECT_OFF_ADDR_KLUDGE or something.  */
-           valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
-           goto define_a_symbol;
+           p = strchr (name, ':');
+           if (p != 0 && p[1] == 'S')
+             {
+               /* The linker relocated it.  We don't want to add an
+                  elfstab_offset_sections-type offset, but we *do* want
+                  to add whatever solib.c passed to symbol_file_add as
+                  addr (this is known to affect SunOS4, and I suspect ELF
+                  too).  Since elfstab_offset_sections currently does not
+                  muck with the text offset (there is no Ttext.text
+                  symbol), we can get addr from the text offset.  If
+                  elfstab_offset_sections ever starts dealing with the
+                  text offset, and we still need to do this, we need to
+                  invent a SECT_OFF_ADDR_KLUDGE or something.  */
+               valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+               goto define_a_symbol;
+             }
          }
        /* Since it's not the kludge case, re-dispatch to the right handler. */
        switch (type) {
@@ -2287,6 +2337,89 @@ elfstab_build_psymtabs (objfile, section_offsets, mainline,
   dbx_symfile_read (objfile, section_offsets, 0);
 }
 \f
+/* Scan and build partial symbols for a file with special sections for stabs
+   and stabstrings.  The file has already been processed to get its minimal
+   symbols, and any other symbols that might be necessary to resolve GSYMs.
+
+   This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
+   rolled into one.
+
+   OBJFILE is the object file we are reading symbols from.
+   ADDR is the address relative to which the symbols are (e.g. the base address
+       of the text segment).
+   MAINLINE is true if we are reading the main symbol table (as opposed to a
+           shared lib or dynamically loaded file).
+   STAB_NAME is the name of the section that contains the stabs.
+   STABSTR_NAME is the name of the section that contains the stab strings.
+
+   This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
+
+void
+stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
+                        stabstr_name)
+     struct objfile *objfile;
+     struct section_offsets *section_offsets;
+     int mainline;
+     char *stab_name;
+     char *stabstr_name;
+{
+  int val;
+  bfd *sym_bfd = objfile->obfd;
+  char *name = bfd_get_filename (sym_bfd);
+  asection *stabsect;
+  asection *stabstrsect;
+
+  stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
+  stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
+
+  if (!stabsect)
+    return;
+
+  if (!stabstrsect)
+    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));
+  memset (DBX_SYMFILE_INFO (objfile), 0, sizeof (struct dbx_symfile_info));
+
+  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");
+
+  DBX_SYMBOL_SIZE    (objfile) = sizeof (struct external_nlist);
+  DBX_SYMCOUNT       (objfile) = bfd_section_size (sym_bfd, stabsect)
+    / DBX_SYMBOL_SIZE (objfile);
+  DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect);
+  DBX_SYMTAB_OFFSET  (objfile) = stabsect->filepos; /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
+  
+  if (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) + 1);
+
+  /* Now read in the string table in one big gulp.  */
+
+  val = bfd_get_section_contents (sym_bfd, /* bfd */
+                                 stabstrsect, /* bfd section */
+                                 DBX_STRINGTAB (objfile), /* input buffer */
+                                 0, /* offset into section */
+                                 DBX_STRINGTAB_SIZE (objfile)); /* amount to read */
+
+  if (!val)
+    perror_with_name (name);
+
+  stabsread_new_init ();
+  buildsym_new_init ();
+  free_header_files ();
+  init_header_files ();
+  install_minimal_symbols (objfile);
+
+  /* Now, do an incremental load */
+
+  processing_acc_compilation = 1;
+  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.
 
index 79dcfe3f79befd2c7e20812937bcc1db66f040ec..3895053282f753eaee3a562b1de4e5ed3f51123b 100644 (file)
@@ -144,7 +144,7 @@ nlm_symtab_read (abfd, addr, objfile)
       for (i = 0; i < number_of_symbols; i++)
        {
          sym = symbol_table[i];
-         if (sym -> flags & BSF_GLOBAL)
+         if (/*sym -> flags & BSF_GLOBAL*/ 1)
            {
              /* Bfd symbols are section relative. */
              symaddr = sym -> value + sym -> section -> vma;
@@ -227,6 +227,9 @@ nlm_symfile_read (objfile, section_offsets, mainline)
 
   nlm_symtab_read (abfd, offset, objfile);
 
+  stabsect_build_psymtabs (objfile, section_offsets, mainline, ".stab",
+                          ".stabstr");
+
   /* FIXME:  We could locate and read the optional native debugging format
      here and add the symbols to the minimal symbol table. */
 
index 794b370271afcb1969037129f5b46f94c4cec059..747e6a5fc2ed5d50e4ee855c15f07770123d1b10 100644 (file)
@@ -500,7 +500,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #ifdef DBXREAD_ONLY
              /* Kludges for ELF/STABS with Sun ACC */
              last_function_name = namestring;
-             if (pst && pst->textlow == 0)
+             /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
+                value for the bottom of the text seg in those cases. */
+             if (pst && pst->textlow == 0 && !symfile_relocatable)
                pst->textlow = CUR_SYMBOL_VALUE;
 #if 0
              if (startup_file_end == 0)
@@ -522,7 +524,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #ifdef DBXREAD_ONLY
              /* Kludges for ELF/STABS with Sun ACC */
              last_function_name = namestring;
-             if (pst && pst->textlow == 0)
+             /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
+                value for the bottom of the text seg in those cases. */
+             if (pst && pst->textlow == 0 && !symfile_relocatable)
                pst->textlow = CUR_SYMBOL_VALUE;
 #if 0
              if (startup_file_end == 0)
index c6e4d786f90472453f2c2fae25085030017032e6..da4632f5679f1aea6ded7aac2482ee43d3934e8b 100644 (file)
@@ -33,6 +33,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "symfile.h"
 #include "objfiles.h"
 #include "aout/stab_gnu.h"     /* We always use GNU stabs, not native */
+#include "libaout.h"
+#include "aout/aout64.h"
+#include "gdb-stabs.h"
 #include "buildsym.h"
 #include "complaints.h"
 #include "demangle.h"
@@ -540,6 +543,19 @@ define_symbol (valu, string, desc, type, objfile)
     obstack_alloc (&objfile -> symbol_obstack, sizeof (struct symbol));
   memset (sym, 0, sizeof (struct symbol));
 
+  switch (type & N_TYPE)
+    {
+    case N_TEXT:
+      SYMBOL_SECTION(sym) = SECT_OFF_TEXT;
+      break;
+    case N_DATA:
+      SYMBOL_SECTION(sym) = SECT_OFF_DATA;
+      break;
+    case N_BSS:
+      SYMBOL_SECTION(sym) = SECT_OFF_BSS;
+      break;
+    }
+
   if (processing_gcc_compilation)
     {
       /* GCC 2.x puts the line number in desc.  SunOS apparently puts in the
@@ -3826,6 +3842,8 @@ scan_file_globals (objfile)
                {
                  SYMBOL_VALUE_ADDRESS (sym) = SYMBOL_VALUE_ADDRESS (msymbol);
                }
+
+             SYMBOL_SECTION (sym) = SYMBOL_SECTION (msymbol);
              
              if (prev)
                {