This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] objdump -dS: warn if source is more recent than object


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5ef2d51bd6ae49b28282835156d1d6622beac4a6

commit 5ef2d51bd6ae49b28282835156d1d6622beac4a6
Author: Alan Modra <amodra@gmail.com>
Date:   Mon Mar 13 20:56:25 2017 +1030

    objdump -dS: warn if source is more recent than object
    
    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.

Diff:
---
 binutils/ChangeLog | 10 +++++++++
 binutils/objdump.c | 60 +++++++++++++++++++++++++++++++-----------------------
 2 files changed, 45 insertions(+), 25 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 92cadf3..71dd6e2 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 46b4417..6cd8d0b 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]