Allow gdb.lookup_objfile to work with symlinked binary
Commit Message
Hi.
This patch enhances gdb.lookup_objfile so that it works with a
symlinked binary.
Regression tested on amd64-linux.
2014-12-18 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.
testsuite/
* gdb.python/py-objfile.exp: Test gdb.lookup_objfile on symlinked
binary.
Comments
Doug Evans writes:
> Hi.
>
> This patch enhances gdb.lookup_objfile so that it works with a
> symlinked binary.
>
> Regression tested on amd64-linux.
>
> 2014-12-18 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.
>
> testsuite/
> * gdb.python/py-objfile.exp: Test gdb.lookup_objfile on symlinked
> binary.
Committed.
@@ -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);
@@ -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);
@@ -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;
}
@@ -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"
+}