* ecoff.c (ecoff_find_nearest_line): Handle fdr.adr != pdr.adr
authorIan Lance Taylor <ian@airs.com>
Wed, 11 May 1994 16:46:04 +0000 (16:46 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 11 May 1994 16:46:04 +0000 (16:46 +0000)
correctly.

bfd/ChangeLog
bfd/ecoff.c

index 1ed5ef67a58b8fd280608f343e836e3c3e41d4df..43eed1f62e6b17d3036469168a55457f6a3e6606 100644 (file)
@@ -1,5 +1,8 @@
 Wed May 11 00:31:57 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
+       * ecoff.c (ecoff_find_nearest_line): Handle fdr.adr != pdr.adr
+       correctly.
+
        * Makefile.in (stmp-bfd.h): Use || instead of ; to force SunOS
        make to invoke the shell.
 
index ba5214c5d3d80870e8ee9a4ce323f643e350e4af..83a3c22d89c602ed10bcf82c30b0e18d35344af1 100644 (file)
@@ -2007,6 +2007,7 @@ ecoff_find_nearest_line (abfd,
   char *pdr_ptr;
   char *pdr_end;
   PDR pdr;
+  bfd_vma first_off;
   unsigned char *line_ptr;
   unsigned char *line_end;
   int lineno;
@@ -2052,10 +2053,12 @@ ecoff_find_nearest_line (abfd,
             + fdr_ptr->ipdFirst * external_pdr_size);
   pdr_end = pdr_ptr + fdr_ptr->cpd * external_pdr_size;
   (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
+  if (offset < pdr.adr)
+    return false;
 
   /* The address of the first PDR is an offset which applies to the
      addresses of all the PDR's.  */
-  offset += pdr.adr;
+  first_off = pdr.adr;
 
   for (pdr_ptr += external_pdr_size;
        pdr_ptr < pdr_end;
@@ -2080,7 +2083,7 @@ ecoff_find_nearest_line (abfd,
   pdr_ptr -= external_pdr_size;
   (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
 
-  offset -= pdr.adr;
+  offset -= pdr.adr - first_off;
   lineno = pdr.lnLow;
   line_ptr = (ecoff_data (abfd)->debug_info.line
              + fdr_ptr->cbLineOffset