aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStu Grossman <grossman@cygnus>1994-04-26 17:14:52 +0000
committerStu Grossman <grossman@cygnus>1994-04-26 17:14:52 +0000
commita66e8382def5fdeb8e291748ce6f1f639a0a63f2 (patch)
tree0a94fe06ff61d6bee8e4f9c407b0f61d39045fe1
parentcde73501070130c57a352d07b9021a8fb0fa3227 (diff)
downloadfsf-binutils-gdb-a66e8382def5fdeb8e291748ce6f1f639a0a63f2.zip
fsf-binutils-gdb-a66e8382def5fdeb8e291748ce6f1f639a0a63f2.tar.gz
fsf-binutils-gdb-a66e8382def5fdeb8e291748ce6f1f639a0a63f2.tar.bz2
* 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.
-rw-r--r--gdb/ChangeLog19
-rw-r--r--gdb/dbxread.c183
-rw-r--r--gdb/nlmread.c5
-rw-r--r--gdb/partial-stab.h8
-rw-r--r--gdb/stabsread.c18
5 files changed, 205 insertions, 28 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 47cde97..43e32c6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 5aa7312..dd81a09 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -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;
/* 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);
}
@@ -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);
}
+/* 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);
+}
+
/* Scan and build partial symbols for a PA symbol file.
This PA file has already been processed to get its minimal symbols.
diff --git a/gdb/nlmread.c b/gdb/nlmread.c
index 79dcfe3..3895053 100644
--- a/gdb/nlmread.c
+++ b/gdb/nlmread.c
@@ -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. */
diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h
index 794b370..747e6a5 100644
--- a/gdb/partial-stab.h
+++ b/gdb/partial-stab.h
@@ -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)
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index c6e4d78..da4632f 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -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)
{