]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
objdump -dS: warn if source is more recent than object
authorAlan Modra <amodra@gmail.com>
Mon, 13 Mar 2017 10:26:25 +0000 (20:56 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 13 Mar 2017 10:50:02 +0000 (21:20 +1030)
If the source file is more recent than the object file, line number
information in the object may no longer match the source.  So print a
warning message.

* objdump.c (update_source_path): Add abfd param.  Add struct
stat vars.  Pass to try_print_file_open.  Warn if source is more
recent than object.
(try_print_file_open, slurp_file): Add struct stat param to
return fstat.
(show_line): Call update_source_path with bfd.

binutils/ChangeLog
binutils/objdump.c

index 92cadf3a31cf8e090111decdb5739bfa3fcbfa74..71dd6e2fb25a94b7d13761a03180c4dd235f0be8 100644 (file)
@@ -1,3 +1,13 @@
+2017-03-13  Alan Modra  <amodra@gmail.com>
+           Taeung Song <treeze.taeung@gmail.com>
+
+       * objdump.c (update_source_path): Add abfd param.  Add struct
+       stat var.  Pass to try_print_file_open.  Warn if source is more
+       recent than object.
+       (try_print_file_open, slurp_file): Add struct stat param to
+       return fstat.
+       (show_line): Call update_source_path with bfd.
+
 2017-03-10  Chia-Hao Lo  <fcamel@gmail.com>
 
        PR binutils/21235
index 46b4417b998e529029ce43a70f0681c56fadbcb5..6cd8d0becac5439715cc6a9187c5d6fbe4bc896a 100644 (file)
@@ -1263,24 +1263,23 @@ static struct print_file_list *print_files;
 /* Read a complete file into memory.  */
 
 static const char *
-slurp_file (const char *fn, size_t *size)
+slurp_file (const char *fn, size_t *size, struct stat *fst)
 {
 #ifdef HAVE_MMAP
   int ps = getpagesize ();
   size_t msize;
 #endif
   const char *map;
-  struct stat st;
   int fd = open (fn, O_RDONLY | O_BINARY);
 
   if (fd < 0)
     return NULL;
-  if (fstat (fd, &st) < 0)
+  if (fstat (fd, fst) < 0)
     {
       close (fd);
       return NULL;
     }
-  *size = st.st_size;
+  *size = fst->st_size;
 #ifdef HAVE_MMAP
   msize = (*size + ps - 1) & ~(ps - 1);
   map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
@@ -1360,13 +1359,13 @@ index_file (const char *map, size_t size, unsigned int *maxline)
    linked list and returns that node.  Returns NULL on failure.  */
 
 static struct print_file_list *
-try_print_file_open (const char *origname, const char *modname)
+try_print_file_open (const char *origname, const char *modname, struct stat *fst)
 {
   struct print_file_list *p;
 
   p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
 
-  p->map = slurp_file (modname, &p->mapsize);
+  p->map = slurp_file (modname, &p->mapsize, fst);
   if (p->map == NULL)
     {
       free (p);
@@ -1389,36 +1388,47 @@ try_print_file_open (const char *origname, const char *modname)
    If found, add location to print_files linked list.  */
 
 static struct print_file_list *
-update_source_path (const char *filename)
+update_source_path (const char *filename, bfd *abfd)
 {
   struct print_file_list *p;
   const char *fname;
+  struct stat fst;
   int i;
 
-  p = try_print_file_open (filename, filename);
-  if (p != NULL)
-    return p;
+  p = try_print_file_open (filename, filename, &fst);
+  if (p == NULL)
+    {
+      if (include_path_count == 0)
+       return NULL;
 
-  if (include_path_count == 0)
-    return NULL;
+      /* Get the name of the file.  */
+      fname = lbasename (filename);
 
-  /* Get the name of the file.  */
-  fname = lbasename (filename);
+      /* If file exists under a new path, we need to add it to the list
+        so that show_line knows about it.  */
+      for (i = 0; i < include_path_count; i++)
+       {
+         char *modname = concat (include_paths[i], "/", fname,
+                                 (const char *) 0);
 
-  /* If file exists under a new path, we need to add it to the list
-     so that show_line knows about it.  */
-  for (i = 0; i < include_path_count; i++)
-    {
-      char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
+         p = try_print_file_open (filename, modname, &fst);
+         if (p)
+           break;
 
-      p = try_print_file_open (filename, modname);
-      if (p)
-       return p;
+         free (modname);
+       }
+    }
+
+  if (p != NULL)
+    {
+      long mtime = bfd_get_mtime (abfd);
 
-      free (modname);
+      if (fst.st_mtime > mtime)
+       warn (_("source file %s is more recent than object file\n"),
+             filename);
     }
 
-  return NULL;
+  return p;
 }
 
 /* Print a source file line.  */
@@ -1551,7 +1561,7 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
        {
          if (reloc)
            filename = xstrdup (filename);
-         p = update_source_path (filename);
+         p = update_source_path (filename, abfd);
        }
 
       if (p != NULL && linenumber != p->last_line)