aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2013-12-02 22:24:32 +0100
committerJan Kratochvil <jan.kratochvil@redhat.com>2013-12-02 22:24:32 +0100
commit04affae3ef7aa124b6ac0ce4f3a54063b7b4784f (patch)
treee7b3b2a4e5c71cce09d6ea41c6bba22e7c0322ba
parentaee4bf85057de1905f5bfaad2a4be0295905d7fb (diff)
downloadgdb-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.
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/objfiles.c17
-rw-r--r--gdb/objfiles.h6
-rw-r--r--gdb/source.c24
-rw-r--r--gdb/testsuite/ChangeLog8
-rw-r--r--gdb/testsuite/gdb.dwarf2/dwp-symlink.c7
-rw-r--r--gdb/testsuite/gdb.dwarf2/dwp-symlink.exp20
-rw-r--r--gdb/utils.c26
-rw-r--r--gdb/utils.h2
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);