Use gdb_sysroot for main executable on attach

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.
This commit is contained in:
Gary Benson 2015-04-17 09:47:30 +01:00
parent af1900b01b
commit a9a5a3d1d2
5 changed files with 54 additions and 16 deletions

View File

@ -1,3 +1,11 @@
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.

View File

@ -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",

View 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.

View 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}

View 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;
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);