This is the mail archive of the binutils@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]

Re: [PATCH v2] Precheck modification time between source and object file before showing source line


Okey, I understood!

Thanks,
Taeung

On 03/13/2017 07:48 PM, Alan Modra wrote:
On Mon, Mar 13, 2017 at 12:40:40AM +0900, Taeung Song wrote:
When running 'objdump -dlS',
if source file is more recent than object file,
line numbers can't match printed actual source code lines.
So print a warning message in the above case.

binutils/ChangeLog:

    * objdump.c (update_source_path): Check modification time between
    source and object file before opening source file.
    (show_line): Pass an argument for the bfd pointer into update_source_path()

The patch isn't correct.  The file might be found on one of the
include paths.  I like the idea though, so fixed it as follows.

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 92cadf3..2384682 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]