* coffread.c (coff_symfile_read): Don't try to read the line

number table from disk if the image file doesn't have a symbol
table; we'll never actually look at the info anyway, and Windows
ships DLL's with bogus file offsets for the line number data.
This commit is contained in:
Jim Blandy 2002-08-22 05:50:11 +00:00
parent 56780f18c5
commit ebeb39fe31
2 changed files with 32 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2002-08-22 Jim Blandy <jimb@redhat.com>
* coffread.c (coff_symfile_read): Don't try to read the line
number table from disk if the image file doesn't have a symbol
table; we'll never actually look at the info anyway, and Windows
ships DLL's with bogus file offsets for the line number data.
2002-08-21 Elena Zannoni <ezannoni@redhat.com>
* rs6000-tdep.c (rs6000_gdbarch_init): Figure out whether we have

View File

@ -593,16 +593,34 @@ coff_symfile_read (struct objfile *objfile, int mainline)
/* End of warning */
/* Read the line number table, all at once. */
info->min_lineno_offset = 0;
info->max_lineno_offset = 0;
bfd_map_over_sections (abfd, find_linenos, (void *) info);
make_cleanup (free_linetab_cleanup, 0 /*ignore*/);
val = init_lineno (abfd, info->min_lineno_offset,
info->max_lineno_offset - info->min_lineno_offset);
if (val < 0)
error ("\"%s\": error reading line numbers\n", name);
/* Only read line number information if we have symbols.
On Windows NT, some of the system's DLL's have sections with
PointerToLinenumbers fields that are non-zero, but point at
random places within the image file. (In the case I found,
KERNEL32.DLL's .text section has a line number info pointer that
points into the middle of the string `lib\\i386\kernel32.dll'.)
However, these DLL's also have no symbols. The line number
tables are meaningless without symbols. And in fact, GDB never
uses the line number information unless there are symbols. So we
can avoid spurious error messages (and maybe run a little
faster!) by not even reading the line number table unless we have
symbols. */
if (num_symbols > 0)
{
/* Read the line number table, all at once. */
bfd_map_over_sections (abfd, find_linenos, (void *) info);
make_cleanup (free_linetab_cleanup, 0 /*ignore*/);
val = init_lineno (abfd, info->min_lineno_offset,
info->max_lineno_offset - info->min_lineno_offset);
if (val < 0)
error ("\"%s\": error reading line numbers\n", name);
}
/* Now read the string table, all at once. */