* dbxread.c (dbx_symfile_init): Init stab_section_info to NULL to

prevent crashes when examining cross-targets.
* dbxread.c (process_one_symbol):  Include directory name when
calling start_subfile for SOL & BINCL symbols.  This allows gdb to
find include files, and yacc/lex sources when the cwd doesn't match
that in which the object was compiled.
* objfiles.h (ALL_MSYMBOLS):  Don't seg fault when there are no
msymbols.
* symtab.c (lookup_symtab_1):  Rewrite.  It now handles include
files.
This commit is contained in:
Stu Grossman 1992-07-08 08:00:30 +00:00
parent 179798e1e0
commit 784fd92b3d
4 changed files with 77 additions and 51 deletions

View File

@ -1,3 +1,16 @@
Wed Jul 8 00:11:02 1992 Stu Grossman (grossman at cygnus.com)
* dbxread.c (dbx_symfile_init): Init stab_section_info to NULL to
prevent crashes when examining cross-targets.
* dbxread.c (process_one_symbol): Include directory name when
calling start_subfile for SOL & BINCL symbols. This allows gdb to
find include files, and yacc/lex sources when the cwd doesn't match
that in which the object was compiled.
* objfiles.h (ALL_MSYMBOLS): Don't seg fault when there are no
msymbols.
* symtab.c (lookup_symtab_1): Rewrite. It now handles include
files.
Tue Jul 7 09:00:42 1992 Fred Fish (fnf@cygnus.com)
* maint.c (maintenance_command, maintenance_info_command):

View File

@ -545,6 +545,7 @@ dbx_symfile_init (objfile)
#endif
/* 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");
@ -1800,17 +1801,17 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
(whose name was given in the N_SO symbol.) */
/* Relocate for dynamic loading */
valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
start_subfile (name, NULL);
start_subfile (name, current_subfile->dirname);
break;
case N_BINCL:
push_subfile ();
add_new_header_file (name, valu);
start_subfile (name, NULL);
start_subfile (name, current_subfile->dirname);
break;
case N_EINCL:
start_subfile (pop_subfile (), NULL);
start_subfile (pop_subfile (), current_subfile->dirname);
break;
case N_EXCL:

View File

@ -358,6 +358,7 @@ have_minimal_symbols PARAMS ((void));
#define ALL_MSYMBOLS(objfile, m) \
ALL_OBJFILES (objfile) \
ALL_OBJFILE_MSYMBOLS (objfile, m)
if ((objfile)->msymbols) \
ALL_OBJFILE_MSYMBOLS (objfile, m)
#endif /* !defined (OBJFILES_H) */

View File

@ -134,63 +134,74 @@ lookup_symtab_1 (name)
register struct symtab *s;
register struct partial_symtab *ps;
register char *slash;
register int len;
register struct objfile *objfile;
ALL_SYMTABS (objfile, s)
{
if (strcmp (name, s->filename) == 0)
{
return (s);
}
}
got_symtab:
ALL_PSYMTABS (objfile, ps)
{
if (strcmp (name, ps -> filename) == 0)
{
if (ps -> readin)
{
error ("Internal: readin pst for `%s' found when no symtab found.", name);
}
return (PSYMTAB_TO_SYMTAB (ps));
}
}
/* First, search for an exact match */
ALL_SYMTABS (objfile, s)
if (strcmp (name, s->filename) == 0)
return s;
slash = strchr (name, '/');
len = strlen (name);
/* Now, search for a matching tail (only if name doesn't have any dirs) */
if (!slash)
{
ALL_SYMTABS (objfile, s)
{
int l = strlen (s->filename);
if (l > len
&& s->filename[l - len -1] == '/'
&& (strcmp (s->filename + l - len, name) == 0))
{
return (s);
}
}
ALL_SYMTABS (objfile, s)
{
char *p = s -> filename;
char *tail = strrchr (p, '/');
ALL_PSYMTABS (objfile, ps)
{
int l = strlen (ps -> filename);
if (tail)
p = tail + 1;
if (strcmp (p, name) == 0)
return s;
}
/* Same search rules as above apply here, but now we look thru the
psymtabs. */
ALL_PSYMTABS (objfile, ps)
if (strcmp (name, ps -> filename) == 0)
goto got_psymtab;
if (!slash)
ALL_PSYMTABS (objfile, ps)
{
char *p = ps -> filename;
char *tail = strrchr (p, '/');
if (tail)
p = tail + 1;
if (strcmp (p, name) == 0)
goto got_psymtab;
}
if (l > len
&& ps -> filename[l - len - 1] == '/'
&& (strcmp (ps->filename + l - len, name) == 0))
{
if (ps -> readin)
{
error ("Internal: readin pst for `%s' found when no symtab found.", name);
}
return (PSYMTAB_TO_SYMTAB (ps));
}
}
}
return (NULL);
got_psymtab:
if (ps -> readin)
error ("Internal: readin pst for `%s' found when no symtab found.", name);
s = PSYMTAB_TO_SYMTAB (ps);
if (s)
return s;
/* At this point, we have located the psymtab for this file, but
the conversion to a symtab has failed. This usually happens
when we are looking up an include file. In this case,
PSYMTAB_TO_SYMTAB doesn't return a symtab, even though one has
been created. So, we need to run through the symtabs again in
order to find the file.
XXX - This is a crock, and should be fixed inside of the the
symbol parsing routines. */
goto got_symtab;
}
/* Lookup the symbol table of a source file named NAME. Try a couple