diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bfd70a622f..af853853dc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2015-04-17 Gary Benson + + * 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 * solist.h (exec_file_find): New declaration. diff --git a/gdb/NEWS b/gdb/NEWS index c24195ecc5..e8d92fbcc1 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -31,6 +31,11 @@ "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", diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 3eb18f5ec2..f10bdf5a8a 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2015-04-17 Gary Benson + + * gdb.texinfo (set sysroot): Document that "set sysroot" also + applies to executable paths if supplied to GDB as absolute. + 2015-04-11 Jan Kratochvil * gdb.texinfo (Mode Options): Remove -xdb. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 6255c144e2..7f765d0bcb 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -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} diff --git a/gdb/exec.c b/gdb/exec.c index 9d4ad90c3f..872b86c698 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -42,6 +42,7 @@ #include #include +#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; - 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); + full_exec_path = exec_file_find (exec_file, &fd); + if (fd >= 0) + close (fd); + } + + 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);