[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