[3/7] Use gdb_sysroot for main executable on attach

Message ID 1427887341-31819-4-git-send-email-gbenson@redhat.com
State Committed
Headers

Commit Message

Gary Benson April 1, 2015, 11:22 a.m. UTC
  This commit updates exec_file_locate_attach to use exec_file_find
to compute the full pathname of the main executable in some cases.
The net effect of this is that the main executable's path will be
prefixed with gdb_sysroot in the same way that shared library paths
currently are.

gdb/ChangeLog:

	* exec.c (solist.h): New include.
	(exec_file_locate_attach): Prefix absolute executable
	paths with gdb_sysroot if set.
	* NEWS: Mention that executable paths may be prepended
	with sysroot on attach.

gdb/doc/ChangeLog:

	* gdb.texinfo (set sysroot): Document that "set sysroot" also
	applies to executable paths if supplied to GDB as absolute.
---
 gdb/ChangeLog       |    8 ++++++++
 gdb/NEWS            |    5 +++++
 gdb/doc/ChangeLog   |    5 +++++
 gdb/doc/gdb.texinfo |   22 ++++++++++++----------
 gdb/exec.c          |   32 ++++++++++++++++++++++++--------
 5 files changed, 54 insertions(+), 18 deletions(-)
  

Comments

Eli Zaretskii April 1, 2015, 2:52 p.m. UTC | #1
> From: Gary Benson <gbenson@redhat.com>
> Date: Wed,  1 Apr 2015 12:22:17 +0100
> 
> +* Paths specified by "set sysroot" will be prepended to the path of
> +  the main executable when attaching to already-running processes
> +  (local and remote) if the path of the main executable is reported
> +  to GDB as absolute by the operating system.

Please don't use "path" when you really mean "file name".

OK with that fixed.

> +shared library paths will be prefixed with @var{path}; many runtime
> +loaders store the absolute paths to the shared library in the target
> +program's memory.  When attaching to already-running processes, their
> +paths will be prefixed with @var{path} if reported to @value{GDBN} as
> +absolute by the operating system.  If you use @code{set sysroot} to
> +find executables and shared libraries, they need to be laid out in
> +the same way that they are on the target, with e.g.@: a @file{/bin},
> +@file{/lib} and @file{/usr/lib} hierarchy under @var{path}.

Same here.  (Yes, I know that the previous text also used "path").

Thanks.
  
Pedro Alves April 15, 2015, 10:43 a.m. UTC | #2
On 04/01/2015 12:22 PM, Gary Benson wrote:

> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -17800,18 +17800,20 @@ may try to load the host's libraries.  @value{GDBN} has two variables
>  to specify the search directories for target libraries.
>  
>  @table @code
> -@cindex prefix for shared library file names
> +@cindex prefix for executable and shared library file names
>  @cindex system root, alternate
>  @kindex set solib-absolute-prefix
>  @kindex set sysroot
>  @item set sysroot @var{path}
>  Use @var{path} as the system root for the program being debugged.  Any
> -absolute shared library paths will be prefixed with @var{path}; many
> -runtime loaders store the absolute paths to the shared library in the
> -target program's memory.  If you use @code{set sysroot} to find shared
> -libraries, they need to be laid out in the same way that they are on
> -the target, with e.g.@: a @file{/lib} and @file{/usr/lib} hierarchy
> -under @var{path}.
> +shared library paths will be prefixed with @var{path}; many runtime
> +loaders store the absolute paths to the shared library in the target
> +program's memory.  When attaching to already-running processes, their

This "When attaching to already-running processes" part confuses me,
as the sysroot is also prepended to paths in the "run" case.

Otherwise looks good to me.

> +paths will be prefixed with @var{path} if reported to @value{GDBN} as
> +absolute by the operating system.  If you use @code{set sysroot} to
> +find executables and shared libraries, they need to be laid out in
> +the same way that they are on the target, with e.g.@: a @file{/bin},
> +@file{/lib} and @file{/usr/lib} hierarchy under @var{path}.
>  
>  If @var{path} starts with the sequence @file{target:} and the target
>  system is remote then @value{GDBN} will retrieve the target binaries
> @@ -17846,7 +17848,7 @@ system:
>    c:/foo/bar.dll @result{} /path/to/sysroot/c:/foo/bar.dll
>  @end smallexample

Thanks,
Pedro Alves
  
Gary Benson April 15, 2015, 12:45 p.m. UTC | #3
Eli Zaretskii wrote:
> > From: Gary Benson <gbenson@redhat.com>
> > Date: Wed,  1 Apr 2015 12:22:17 +0100
> > 
> > +* Paths specified by "set sysroot" will be prepended to the path of
> > +  the main executable when attaching to already-running processes
> > +  (local and remote) if the path of the main executable is reported
> > +  to GDB as absolute by the operating system.
> 
> Please don't use "path" when you really mean "file name".
> 
> > +shared library paths will be prefixed with @var{path}; many runtime
> > +loaders store the absolute paths to the shared library in the target
> > +program's memory.  When attaching to already-running processes, their
> > +paths will be prefixed with @var{path} if reported to @value{GDBN} as
> > +absolute by the operating system.  If you use @code{set sysroot} to
> > +find executables and shared libraries, they need to be laid out in
> > +the same way that they are on the target, with e.g.@: a @file{/bin},
> > +@file{/lib} and @file{/usr/lib} hierarchy under @var{path}.
> 
> Same here.  (Yes, I know that the previous text also used "path").

Pedro Alves wrote:
> This "When attaching to already-running processes" part confuses me,
> as the sysroot is also prepended to paths in the "run" case.

How about these replacements for those two chunks:

NEWS:
+* The system root specified by "set sysroot" will be prepended to the
+  filename of the main executable (if reported to GDB as absolute by
+  the operating system) when starting processes remotely, and when
+  attaching to already-running local or remote processes.

gdb.texinfo:
 Use @var{path} as the system root for the program being debugged. Any
 absolute shared library paths will be prefixed with @var{path}; many
 runtime loaders store the absolute paths to the shared library in the
-target program's memory.  If you use @code{set sysroot} to find shared
-libraries, they need to be laid out in the same way that they are on
-the target, with e.g.@: a @file{/lib} and @file{/usr/lib} hierarchy
-under @var{path}.
+target program's memory.  When starting processes remotely, and when
+attaching to already-running processes (local or remote), their
+filenames will be prefixed with @var{path} if reported to @value{GDBN}
+as absolute by the operating system.  If you use @code{set sysroot} to
+find executables and shared libraries, they need to be laid out in the
+same way that they are on the target, with e.g.@: a @file{/bin},
+@file{/lib} and @file{/usr/lib} hierarchy under @var{path}.

At this point in the series the prefixing only happens when attaching
to local processes--attaching to some remote processes appears in
patch 5, and attaching to all remote processes and to remote processes
we start is patch 7--but I didn't want to jiggle the doc at every
step.  The above chunks are for the whole thing, which I can leave
here in patch 3 or move to patch 7, whatever people prefer.

Cheers,
Gary
  

Patch

diff --git a/gdb/NEWS b/gdb/NEWS
index f2a51a4..dec60cb 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -16,6 +16,11 @@ 
   system, be it local or remote.  This replaces the prefix "remote:".
   The default sysroot has been changed from "" to "target:".
 
+* Paths specified by "set sysroot" will be prepended to the path of
+  the main executable when attaching to already-running processes
+  (local and remote) if the path of the main executable is reported
+  to GDB as absolute by the operating system.
+
 * Python Scripting
 
   ** gdb.Objfile objects have a new attribute "username",
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 93e7e87..692d70e 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -17800,18 +17800,20 @@  may try to load the host's libraries.  @value{GDBN} has two variables
 to specify the search directories for target libraries.
 
 @table @code
-@cindex prefix for shared library file names
+@cindex prefix for executable and shared library file names
 @cindex system root, alternate
 @kindex set solib-absolute-prefix
 @kindex set sysroot
 @item set sysroot @var{path}
 Use @var{path} as the system root for the program being debugged.  Any
-absolute shared library paths will be prefixed with @var{path}; many
-runtime loaders store the absolute paths to the shared library in the
-target program's memory.  If you use @code{set sysroot} to find shared
-libraries, they need to be laid out in the same way that they are on
-the target, with e.g.@: a @file{/lib} and @file{/usr/lib} hierarchy
-under @var{path}.
+shared library paths will be prefixed with @var{path}; many runtime
+loaders store the absolute paths to the shared library in the target
+program's memory.  When attaching to already-running processes, their
+paths will be prefixed with @var{path} if reported to @value{GDBN} as
+absolute by the operating system.  If you use @code{set sysroot} to
+find executables and shared libraries, they need to be laid out in
+the same way that they are on the target, with e.g.@: a @file{/bin},
+@file{/lib} and @file{/usr/lib} hierarchy under @var{path}.
 
 If @var{path} starts with the sequence @file{target:} and the target
 system is remote then @value{GDBN} will retrieve the target binaries
@@ -17846,7 +17848,7 @@  system:
   c:/foo/bar.dll @result{} /path/to/sysroot/c:/foo/bar.dll
 @end smallexample
 
-If that does not find the shared library, @value{GDBN} tries removing
+If that does not find the binary, @value{GDBN} tries removing
 the @samp{:} character from the drive spec, both for convenience, and,
 for the case of the host file system not supporting file names with
 colons:
@@ -17871,7 +17873,7 @@  and point the system root at @file{/path/to/sysroot}, so that
 @value{GDBN} can find the correct copies of both
 @file{c:\sys\bin\foo.dll}, and @file{z:\sys\bin\bar.dll}.
 
-If that still does not find the shared library, @value{GDBN} tries
+If that still does not find the binary, @value{GDBN} tries
 removing the whole drive spec from the target file name:
 
 @smallexample
@@ -17895,7 +17897,7 @@  location.
 
 @kindex show sysroot
 @item show sysroot
-Display the current shared library prefix.
+Display the current executable and shared library prefix.
 
 @kindex set solib-search-path
 @item set solib-search-path @var{path}
diff --git a/gdb/exec.c b/gdb/exec.c
index ab7fcbb..99c0cd4 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -42,6 +42,7 @@ 
 
 #include <ctype.h>
 #include <sys/stat.h>
+#include "solist.h"
 
 void (*deprecated_file_changed_hook) (char *);
 
@@ -151,15 +152,30 @@  exec_file_locate_attach (int pid, int from_tty)
   if (exec_file == NULL)
     return;
 
-  /* It's possible we don't have a full path, but rather just a
-     filename.  Some targets, such as HP-UX, don't provide the
-     full path, sigh.
+  /* If gdb_sysroot is not empty and the discovered filename
+     is absolute then prefix the filename with gdb_sysroot.  */
+  if (gdb_sysroot != NULL && *gdb_sysroot != '\0'
+      && IS_ABSOLUTE_PATH (exec_file))
+    {
+      int fd = -1;
+
+      full_exec_path = exec_file_find (exec_file, &fd);
+      if (fd >= 0)
+	close (fd);
+    }
 
-     Attempt to qualify the filename against the source path.
-     (If that fails, we'll just fall back on the original
-     filename.  Not much more we can do...)  */
-  if (!source_full_path_of (exec_file, &full_exec_path))
-    full_exec_path = xstrdup (exec_file);
+  if (full_exec_path == NULL)
+    {
+      /* It's possible we don't have a full path, but rather just a
+	 filename.  Some targets, such as HP-UX, don't provide the
+	 full path, sigh.
+
+	 Attempt to qualify the filename against the source path.
+	 (If that fails, we'll just fall back on the original
+	 filename.  Not much more we can do...)  */
+      if (!source_full_path_of (exec_file, &full_exec_path))
+	full_exec_path = xstrdup (exec_file);
+    }
 
   exec_file_attach (full_exec_path, from_tty);
   symbol_file_add_main (full_exec_path, from_tty);