* coffread.c (coff_symfile_read): Don't try to read the line
authorJim Blandy <jimb@codesourcery.com>
Thu, 22 Aug 2002 05:50:11 +0000 (05:50 +0000)
committerJim Blandy <jimb@codesourcery.com>
Thu, 22 Aug 2002 05:50:11 +0000 (05:50 +0000)
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.

gdb/ChangeLog
gdb/coffread.c

index c010aeb9934dd56636eda8a10cbfc20c4cb4a27f..4a7c0fe1602c4c6032651f134a2e742f78682d35 100644 (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
index 52b36c88c34307b53e70f58d7e41588fd0c33a04..d794a7d382a567434321511987e2d48c6771ea6b 100644 (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.  */