From e02c96a79949824bbe1da22ddfc6b50d362fb552 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Tue, 13 Jan 2015 17:00:31 -0800 Subject: [PATCH] Enhance gdb.lookup_objfile so that it works with a symlinked binary. 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 | 8 ++++++++ gdb/objfiles.c | 13 ++++++++++++- gdb/objfiles.h | 9 +++++++++ gdb/python/py-objfile.c | 8 +++++++- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.python/py-objfile.exp | 11 +++++++++++ 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8a725ea82e..3431c2ca0e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2015-01-13 Doug Evans + + * 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 * NEWS: Create a new section for the next release branch. diff --git a/gdb/objfiles.c b/gdb/objfiles.c index c397f6872c..ff20bc8fcf 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -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) @@ -1505,6 +1505,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) { diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 8782797089..a0dc69b920 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -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); diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index bdc483aec5..378db58fea 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -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; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 4a903bccb1..fa7ffa9343 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-01-13 Doug Evans + + * gdb.python/py-objfile.exp: Test gdb.lookup_objfile on symlinked + binary. + 2015-01-13 Joel Brobecker * Makefile.in (clean mostlyclean): Do not delete *.py. diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.python/py-objfile.exp index 50339a6c9f..cddbd3de89 100644 --- a/gdb/testsuite/gdb.python/py-objfile.exp +++ b/gdb/testsuite/gdb.python/py-objfile.exp @@ -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" +} -- 2.34.1