This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC] Record objfile->original_name as an absolute path


Hi.

The comment for objfile->original_name says the path is stored as an
absolute path, but that's not the case, and that got me thinking:
What if the user cd's before the debug info is accessed?

This patch is only RFC, and not RFA, because I'm not sure how to do
something better in the test.  I can certainly clean up what's there,
if people think it's not *too* cheezy.

[Later, if we ever choose to display objfile->original_name in
some context, and want to clean up the name a bit (/tmp/./foo -> /tmp/foo),
I can imagine making a function out of the canonicalizer in
cli-cmds.c:cd_command and using that.
[We wouldn't want to remove "../" for this case though unless we go to
the extra trouble of not expanding symlinks.]]

2013-09-25  Doug Evans  <dje@google.com>

	* objfiles.c (allocate_objfile): Save original_name as an absolute
	path.
	* objfiles.c (struct objfile): Expand comment on original_name.
	* utils.c (gdb_abspath): New function.
	* utils.h (gdb_abspath): Declare.

	testsuite/
	* 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.

Index: objfiles.c
===================================================================
RCS file: /cvs/src/src/gdb/objfiles.c,v
retrieving revision 1.168
diff -u -p -r1.168 objfiles.c
--- objfiles.c	26 Sep 2013 01:08:35 -0000	1.168
+++ objfiles.c	26 Sep 2013 01:11:55 -0000
@@ -270,6 +270,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 ();
@@ -283,10 +284,18 @@ allocate_objfile (bfd *abfd, const char 
   if (name == NULL)
     {
       gdb_assert (abfd == NULL);
-      name = "<<anonymous objfile>>";
+      expanded_name = xstrdup ("<<anonymous objfile>>");
     }
-  objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, name,
-					  strlen (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
Index: objfiles.h
===================================================================
RCS file: /cvs/src/src/gdb/objfiles.h,v
retrieving revision 1.112
diff -u -p -r1.112 objfiles.h
--- objfiles.h	24 Sep 2013 14:00:06 -0000	1.112
+++ objfiles.h	26 Sep 2013 01:11:55 -0000
@@ -205,8 +205,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;
Index: utils.c
===================================================================
RCS file: /cvs/src/src/gdb/utils.c,v
retrieving revision 1.306
diff -u -p -r1.306 utils.c
--- utils.c	13 Aug 2013 08:31:20 -0000	1.306
+++ utils.c	26 Sep 2013 01:11:55 -0000
@@ -3204,6 +3204,38 @@ gdb_realpath (const char *filename)
   return xstrdup (filename);
 }
 
+/* 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)
+{
+#if defined (PATH_MAX)
+  char cwd_buf[PATH_MAX];
+#elif defined (_WIN32)
+  char cwd_buf[MAX_PATH];
+#else
+  char cwd_buf[1024];
+#endif
+
+  gdb_assert (path != NULL && path[0] != '\0');
+
+  if (path[0] == '~')
+    return tilde_expand (path);
+
+  if (IS_ABSOLUTE_PATH (path))
+    return xstrdup (path);
+
+  if (getcwd (cwd_buf, sizeof (cwd_buf)) == NULL)
+    return xstrdup (path);
+  return concat (cwd_buf, SLASH_STRING, path, NULL);
+}
+
 ULONGEST
 align_up (ULONGEST v, int n)
 {
Index: utils.h
===================================================================
RCS file: /cvs/src/src/gdb/utils.h,v
retrieving revision 1.11
diff -u -p -r1.11 utils.h
--- utils.h	1 Aug 2013 09:09:58 -0000	1.11
+++ utils.h	26 Sep 2013 01:11:55 -0000
@@ -128,6 +128,8 @@ extern struct cleanup *make_bpstat_clear
 
 extern char *gdb_realpath (const char *);
 
+extern char *gdb_abspath (const char *);
+
 extern int gdb_filename_fnmatch (const char *pattern, const char *string,
 				 int flags);
 
Index: testsuite/gdb.dwarf2/dwp-symlink.c
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.dwarf2/dwp-symlink.c,v
retrieving revision 1.1
diff -u -p -r1.1 dwp-symlink.c
--- testsuite/gdb.dwarf2/dwp-symlink.c	24 Sep 2013 14:03:43 -0000	1.1
+++ testsuite/gdb.dwarf2/dwp-symlink.c	26 Sep 2013 01:11:55 -0000
@@ -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)
 {
Index: testsuite/gdb.dwarf2/dwp-symlink.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.dwarf2/dwp-symlink.exp,v
retrieving revision 1.1
diff -u -p -r1.1 dwp-symlink.exp
--- testsuite/gdb.dwarf2/dwp-symlink.exp	24 Sep 2013 14:03:43 -0000	1.1
+++ testsuite/gdb.dwarf2/dwp-symlink.exp	26 Sep 2013 01:11:55 -0000
@@ -75,3 +75,23 @@ gdb_test "ptype main" {type = int \(\)} 
 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]