Enhance gdb.lookup_objfile so that it works with a symlinked binary.
authorDoug Evans <dje@google.com>
Wed, 14 Jan 2015 01:00:31 +0000 (17:00 -0800)
committerDoug Evans <dje@google.com>
Wed, 14 Jan 2015 01:02:53 +0000 (17:02 -0800)
gdb/Changelog:

* objfiles.c (objfile_filename): New function.
* objfiles.h (objfile_filename): Declare it.
(objfile_name): Add function comment.
* python/py-objfile.c (objfpy_lookup_objfile_by_name): Try both the
bfd file name (which may be realpath'd), and the original name.

gdb/testsuite/ChangeLog:

* gdb.python/py-objfile.exp: Test gdb.lookup_objfile on symlinked
binary.

gdb/ChangeLog
gdb/objfiles.c
gdb/objfiles.h
gdb/python/py-objfile.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-objfile.exp

index 8a725ea..3431c2c 100644 (file)
@@ -1,3 +1,11 @@
+2015-01-13  Doug Evans  <dje@google.com>
+
+       * objfiles.c (objfile_filename): New function.
+       * objfiles.h (objfile_filename): Declare it.
+       (objfile_name): Add function comment.
+       * python/py-objfile.c (objfpy_lookup_objfile_by_name): Try both the
+       bfd file name (which may be realpath'd), and the original name.
+
 2015-01-13  Joel Brobecker  <brobecker@adacore.com>
 
        * NEWS: Create a new section for the next release branch.
index c397f68..ff20bc8 100644 (file)
@@ -1492,7 +1492,7 @@ default_iterate_over_objfiles_in_search_order
     }
 }
 
-/* Return canonical name for OBJFILE.  */
+/* See objfiles.h.  */
 
 const char *
 objfile_name (const struct objfile *objfile)
@@ -1506,6 +1506,17 @@ objfile_name (const struct objfile *objfile)
 /* See objfiles.h.  */
 
 const char *
+objfile_filename (const struct objfile *objfile)
+{
+  if (objfile->obfd != NULL)
+    return bfd_get_filename (objfile->obfd);
+
+  return NULL;
+}
+
+/* See objfiles.h.  */
+
+const char *
 objfile_debug_name (const struct objfile *objfile)
 {
   return lbasename (objfile->original_name);
index 8782797..a0dc69b 100644 (file)
@@ -699,8 +699,17 @@ extern void default_iterate_over_objfiles_in_search_order
 
 void set_objfile_per_bfd (struct objfile *obj);
 
+/* Return canonical name for OBJFILE.
+   This is the real file name if the file has been opened.
+   Otherwise it is the original name supplied by the user.  */
+
 const char *objfile_name (const struct objfile *objfile);
 
+/* Return the (real) file name of OBJFILE if the file has been opened,
+   otherwise return NULL.  */
+
+const char *objfile_filename (const struct objfile *objfile);
+
 /* Return the name to print for OBJFILE in debugging messages.  */
 
 extern const char *objfile_debug_name (const struct objfile *objfile);
index bdc483a..378db58 100644 (file)
@@ -438,12 +438,18 @@ objfpy_lookup_objfile_by_name (const char *name)
 
   ALL_OBJFILES (objfile)
     {
+      const char *filename;
+
       if ((objfile->flags & OBJF_NOT_FILENAME) != 0)
        continue;
       /* Don't return separate debug files.  */
       if (objfile->separate_debug_objfile_backlink != NULL)
        continue;
-      if (compare_filenames_for_search (objfile_name (objfile), name))
+
+      filename = objfile_filename (objfile);
+      if (filename != NULL && compare_filenames_for_search (filename, name))
+       return objfile;
+      if (compare_filenames_for_search (objfile->original_name, name))
        return objfile;
     }
 
index 4a903bc..fa7ffa9 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-13  Doug Evans  <dje@google.com>
+
+       * gdb.python/py-objfile.exp: Test gdb.lookup_objfile on symlinked
+       binary.
+
 2015-01-13  Joel Brobecker  <brobecker@adacore.com>
 
        * Makefile.in (clean mostlyclean): Do not delete *.py.
index 50339a6..cddbd3d 100644 (file)
@@ -115,3 +115,14 @@ if { [get_python_valueof "sep_objfile.build_id" "None"] != "None" } {
     gdb_test "python print (gdb.lookup_objfile (sep_objfile.build_id, by_build_id=True))" \
        "Objfile not found\\.\r\n${python_error_text}"
 }
+
+# An objfile that was a symlink to a differently named file is still
+# findable with its original name.
+set symlink_binary [standard_output_file "symlink-binary"]
+remote_exec host "rm -f ${symlink_binary}"
+remote_exec host "ln -sf ${testfile} ${symlink_binary}"
+if [remote_file host exists "${symlink_binary}"] {
+    clean_restart "${symlink_binary}"
+    gdb_test "python print (gdb.lookup_objfile (\"${symlink_binary}\").filename)" \
+       "${testfile}" "gdb.lookup_objfile of symlinked binary"
+}