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)