From a66e8382def5fdeb8e291748ce6f1f639a0a63f2 Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Tue, 26 Apr 1994 17:14:52 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 19 +++++ gdb/dbxread.c | 183 ++++++++++++++++++++++++++++++++++++++------- gdb/nlmread.c | 5 +- gdb/partial-stab.h | 8 +- gdb/stabsread.c | 18 +++++ 5 files changed, 205 insertions(+), 28 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 47cde979501..43e32c6fe62 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 5aa731266be..dd81a09eedd 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 79dcfe3f79b..3895053282f 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 794b370271a..747e6a5fc2e 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 c6e4d786f90..da4632f5679 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) { -- 2.30.2