diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2013-12-02 22:24:32 +0100 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2013-12-02 22:24:32 +0100 |
commit | 04affae3ef7aa124b6ac0ce4f3a54063b7b4784f (patch) | |
tree | e7b3b2a4e5c71cce09d6ea41c6bba22e7c0322ba /gdb | |
parent | aee4bf85057de1905f5bfaad2a4be0295905d7fb (diff) | |
download | gdb-04affae3ef7aa124b6ac0ce4f3a54063b7b4784f.zip gdb-04affae3ef7aa124b6ac0ce4f3a54063b7b4784f.tar.gz gdb-04affae3ef7aa124b6ac0ce4f3a54063b7b4784f.tar.bz2 |
Record objfile->original_name as an absolute path
gdb/
2013-12-02 Doug Evans <dje@google.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
* objfiles.c (allocate_objfile): Save original_name as an absolute
path.
* objfiles.h (struct objfile): Expand comment on original_name.
* source.c (openp): Call gdb_abspath.
* utils.c (gdb_abspath): New function.
* utils.h (gdb_abspath): Declare.
gdb/testsuite/
2013-12-02 Doug Evans <dje@google.com>
* gdb.dwarf/dwp-symlink.c: Fake out gdb to not load debug info
at start.
* gdb.dwarf/dwp-symlink.exp: Test trying to load dwp when the binary
has been specified with a relative path and we have chdir'd before
accessing the debug info.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/objfiles.c | 17 | ||||
-rw-r--r-- | gdb/objfiles.h | 6 | ||||
-rw-r--r-- | gdb/source.c | 24 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dwp-symlink.c | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dwp-symlink.exp | 20 | ||||
-rw-r--r-- | gdb/utils.c | 26 | ||||
-rw-r--r-- | gdb/utils.h | 2 |
9 files changed, 94 insertions, 26 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2e40664..7124ba5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2013-12-02 Doug Evans <dje@google.com> + Jan Kratochvil <jan.kratochvil@redhat.com> + + * objfiles.c (allocate_objfile): Save original_name as an absolute + path. + * objfiles.h (struct objfile): Expand comment on original_name. + * source.c (openp): Call gdb_abspath. + * utils.c (gdb_abspath): New function. + * utils.h (gdb_abspath): Declare. + 2013-12-02 Pedro Alves <palves@redhat.com> * dcache.c (dcache_read_line): Use target_read_raw_memory. diff --git a/gdb/objfiles.c b/gdb/objfiles.c index ba930fa..1b957cc 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -272,6 +272,7 @@ struct objfile * allocate_objfile (bfd *abfd, const char *name, int flags) { struct objfile *objfile; + char *expanded_name; objfile = (struct objfile *) xzalloc (sizeof (struct objfile)); objfile->psymbol_cache = psymbol_bcache_init (); @@ -286,10 +287,20 @@ allocate_objfile (bfd *abfd, const char *name, int flags) { gdb_assert (abfd == NULL); gdb_assert ((flags & OBJF_NOT_FILENAME) != 0); - name = "<<anonymous objfile>>"; + expanded_name = xstrdup ("<<anonymous objfile>>"); } - objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, name, - strlen (name)); + else if ((flags & OBJF_NOT_FILENAME) != 0) + expanded_name = xstrdup (name); + else + expanded_name = gdb_abspath (name); + objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, + expanded_name, + strlen (expanded_name)); + xfree (expanded_name); + + /* Update the per-objfile information that comes from the bfd, ensuring + that any data that is reference is saved in the per-objfile data + region. */ /* Update the per-objfile information that comes from the bfd, ensuring that any data that is reference is saved in the per-objfile data diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 9bca812..bc16dc7 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -212,8 +212,10 @@ struct objfile struct objfile *next; - /* The object file's name, tilde-expanded and absolute. This - pointer is never NULL. This does not have to be freed; it is + /* The object file's original name as specified by the user, + made absolute, and tilde-expanded. However, it is not canonicalized + (i.e., it has not been passed through gdb_realpath). + This pointer is never NULL. This does not have to be freed; it is guaranteed to have a lifetime at least as long as the objfile. */ char *original_name; diff --git a/gdb/source.c b/gdb/source.c index 0959585..6234bfc 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -853,28 +853,10 @@ done: /* If a file was opened, canonicalize its filename. */ if (fd < 0) *filename_opened = NULL; + else if ((opts & OPF_RETURN_REALPATH) != 0) + *filename_opened = gdb_realpath (filename); else - { - char *(*realpath_fptr) (const char *); - - realpath_fptr = ((opts & OPF_RETURN_REALPATH) != 0 - ? gdb_realpath : xstrdup); - - if (IS_ABSOLUTE_PATH (filename)) - *filename_opened = realpath_fptr (filename); - else - { - /* Beware the // my son, the Emacs barfs, the botch that catch... */ - - char *f = concat (current_directory, - IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]) - ? "" : SLASH_STRING, - filename, (char *)NULL); - - *filename_opened = realpath_fptr (f); - xfree (f); - } - } + *filename_opened = gdb_abspath (filename); } return fd; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 6015172..8be246d 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-12-02 Doug Evans <dje@google.com> + + * gdb.dwarf/dwp-symlink.c: Fake out gdb to not load debug info + at start. + * gdb.dwarf/dwp-symlink.exp: Test trying to load dwp when the binary + has been specified with a relative path and we have chdir'd before + accessing the debug info. + 2013-11-28 Andrew Burgess <aburgess@broadcom.com> * gdb.trace/unavailable.exp (gdb_collect_args_test): Update diff --git a/gdb/testsuite/gdb.dwarf2/dwp-symlink.c b/gdb/testsuite/gdb.dwarf2/dwp-symlink.c index 5be12fb..a93d5e7 100644 --- a/gdb/testsuite/gdb.dwarf2/dwp-symlink.c +++ b/gdb/testsuite/gdb.dwarf2/dwp-symlink.c @@ -15,6 +15,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* Cheezy hack to prevent set_initial_language from trying to look up main. + We do this so that gdb won't try to open the dwp file when the file is + first selected. This gives us a chance to do a chdir before attempting + to access the debug info. */ +asm (".globl main.main"); +asm ("main.main: .byte 0"); + int main (int argc, char **argv) { diff --git a/gdb/testsuite/gdb.dwarf2/dwp-symlink.exp b/gdb/testsuite/gdb.dwarf2/dwp-symlink.exp index ad0522b..a0daae4 100644 --- a/gdb/testsuite/gdb.dwarf2/dwp-symlink.exp +++ b/gdb/testsuite/gdb.dwarf2/dwp-symlink.exp @@ -75,3 +75,23 @@ gdb_test "ptype main" {type = int \(\)} "binary default, dwp at symlink" clean_restart "$thelink" gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp at symlink" + +# Verify we can still find the dwp if we change directories and we specified +# a relative path for the program. + +set saved_pwd [pwd] + +# This is clean_restart, but specifying a relative path to the binary. +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_test "cd [file dirname [standard_output_file ${thelink}]]" \ + "Working directory .*" +gdb_load "./${thelink}" + +gdb_test "cd .." "Working directory .*" + +gdb_test "ptype main" {type = int \(int, char \*\*\)} \ + "relative path, binary symlink, dwp at symlink" + +cd $saved_pwd diff --git a/gdb/utils.c b/gdb/utils.c index 10c73d3..975c432 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3274,6 +3274,32 @@ gdb_realpath_keepfile (const char *filename) return result; } +/* Return PATH in absolute form, performing tilde-expansion if necessary. + PATH cannot be NULL or the empty string. + This does not resolve symlinks however, use gdb_realpath for that. + Space for the result is allocated with malloc. + If the path is already absolute, it is strdup'd. + If there is a problem computing the absolute path, the path is returned + unchanged (still strdup'd). */ + +char * +gdb_abspath (const char *path) +{ + gdb_assert (path != NULL && path[0] != '\0'); + + if (path[0] == '~') + return tilde_expand (path); + + if (IS_ABSOLUTE_PATH (path)) + return xstrdup (path); + + /* Beware the // my son, the Emacs barfs, the botch that catch... */ + return concat (current_directory, + IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]) + ? "" : SLASH_STRING, + path, (char *) NULL); +} + ULONGEST align_up (ULONGEST v, int n) { diff --git a/gdb/utils.h b/gdb/utils.h index 2082511..d0afe29 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -130,6 +130,8 @@ extern char *gdb_realpath (const char *); extern char *gdb_realpath_keepfile (const char *); +extern char *gdb_abspath (const char *); + extern int gdb_filename_fnmatch (const char *pattern, const char *string, int flags); |