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

Taeung Song treeze.taeung@gmail.com
Mon Mar 13 13:55:00 GMT 2017


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)
>



More information about the Binutils mailing list