Use gdb_sysroot for main executable on attach
authorGary Benson <gbenson@redhat.com>
Fri, 17 Apr 2015 08:47:30 +0000 (09:47 +0100)
committerGary Benson <gbenson@redhat.com>
Fri, 17 Apr 2015 08:47:30 +0000 (09:47 +0100)
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.

gdb/doc/ChangeLog:

* gdb.texinfo (set sysroot): Document that "set sysroot" also
applies to executable paths if supplied to GDB as absolute.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/exec.c

index bfd70a6..af85385 100644 (file)
@@ -1,5 +1,13 @@
 2015-04-17  Gary Benson <gbenson@redhat.com>
 
+       * 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.
+
+2015-04-17  Gary Benson <gbenson@redhat.com>
+
        * solist.h (exec_file_find): New declaration.
        * solib.c (solib_find_1): New function, factored out from...
        (solib_find): ...here.
index c24195e..e8d92fb 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
   "target:".  "remote:" is automatically converted to "target:" for
   backward compatibility.
 
+* 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.
+
 * Python Scripting
 
   ** gdb.Objfile objects have a new attribute "username",
index 3eb18f5..f10bdf5 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-17  Gary Benson <gbenson@redhat.com>
+
+       * gdb.texinfo (set sysroot): Document that "set sysroot" also
+       applies to executable paths if supplied to GDB as absolute.
+
 2015-04-11  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.texinfo (Mode Options): Remove -xdb.
index 6255c14..7f765d0 100644 (file)
@@ -17912,7 +17912,7 @@ 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
@@ -17920,10 +17920,14 @@ to specify the search directories for target libraries.
 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
+executable 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}.
 
 If @var{path} starts with the sequence @file{target:} and the target
 system is remote then @value{GDBN} will retrieve the target binaries
@@ -17958,7 +17962,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:
@@ -17983,7 +17987,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
@@ -18007,7 +18011,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}
index 9d4ad90..872b86c 100644 (file)
@@ -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);