* 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.
This commit is contained in:
Stu Grossman 1994-04-26 17:14:52 +00:00
parent cde7350107
commit a66e8382de
5 changed files with 205 additions and 28 deletions

View 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

View 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;
/* 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.

View 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. */

View 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)

View 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)
{