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> 2015-04-17 Gary Benson <gbenson@redhat.com>
* solist.h (exec_file_find): New declaration. * solist.h (exec_file_find): New declaration.

View File

@ -31,6 +31,11 @@
"target:". "remote:" is automatically converted to "target:" for "target:". "remote:" is automatically converted to "target:" for
backward compatibility. 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 * Python Scripting
** gdb.Objfile objects have a new attribute "username", ** 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> 2015-04-11 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.texinfo (Mode Options): Remove -xdb. * 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. to specify the search directories for target libraries.
@table @code @table @code
@cindex prefix for shared library file names @cindex prefix for executable and shared library file names
@cindex system root, alternate @cindex system root, alternate
@kindex set solib-absolute-prefix @kindex set solib-absolute-prefix
@kindex set sysroot @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 Use @var{path} as the system root for the program being debugged. Any
absolute shared library paths will be prefixed with @var{path}; many absolute shared library paths will be prefixed with @var{path}; many
runtime loaders store the absolute paths to the shared library in the 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 target program's memory. When starting processes remotely, and when
libraries, they need to be laid out in the same way that they are on attaching to already-running processes (local or remote), their
the target, with e.g.@: a @file{/lib} and @file{/usr/lib} hierarchy executable filenames will be prefixed with @var{path} if reported to
under @var{path}. @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 If @var{path} starts with the sequence @file{target:} and the target
system is remote then @value{GDBN} will retrieve the target binaries 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 c:/foo/bar.dll @result{} /path/to/sysroot/c:/foo/bar.dll
@end smallexample @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, the @samp{:} character from the drive spec, both for convenience, and,
for the case of the host file system not supporting file names with for the case of the host file system not supporting file names with
colons: 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 @value{GDBN} can find the correct copies of both
@file{c:\sys\bin\foo.dll}, and @file{z:\sys\bin\bar.dll}. @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: removing the whole drive spec from the target file name:
@smallexample @smallexample
@ -18007,7 +18011,7 @@ location.
@kindex show sysroot @kindex show sysroot
@item show sysroot @item show sysroot
Display the current shared library prefix. Display the current executable and shared library prefix.
@kindex set solib-search-path @kindex set solib-search-path
@item set solib-search-path @var{path} @item set solib-search-path @var{path}

View File

@ -42,6 +42,7 @@
#include <ctype.h> #include <ctype.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "solist.h"
void (*deprecated_file_changed_hook) (char *); void (*deprecated_file_changed_hook) (char *);
@ -151,15 +152,30 @@ exec_file_locate_attach (int pid, int from_tty)
if (exec_file == NULL) if (exec_file == NULL)
return; return;
/* It's possible we don't have a full path, but rather just a /* If gdb_sysroot is not empty and the discovered filename
filename. Some targets, such as HP-UX, don't provide the is absolute then prefix the filename with gdb_sysroot. */
full path, sigh. if (gdb_sysroot != NULL && *gdb_sysroot != '\0'
&& IS_ABSOLUTE_PATH (exec_file))
{
int fd = -1;
Attempt to qualify the filename against the source path. full_exec_path = exec_file_find (exec_file, &fd);
(If that fails, we'll just fall back on the original if (fd >= 0)
filename. Not much more we can do...) */ close (fd);
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); exec_file_attach (full_exec_path, from_tty);
symbol_file_add_main (full_exec_path, from_tty); symbol_file_add_main (full_exec_path, from_tty);