Record objfile->original_name as an absolute path
gdb/ 2013-12-02 Doug Evans <dje@google.com> Jan Kratochvil <jan.kratochvil@redhat.com> * objfiles.c (allocate_objfile): Save original_name as an absolute path. * objfiles.h (struct objfile): Expand comment on original_name. * source.c (openp): Call gdb_abspath. * utils.c (gdb_abspath): New function. * utils.h (gdb_abspath): Declare. gdb/testsuite/ 2013-12-02 Doug Evans <dje@google.com> * gdb.dwarf/dwp-symlink.c: Fake out gdb to not load debug info at start. * gdb.dwarf/dwp-symlink.exp: Test trying to load dwp when the binary has been specified with a relative path and we have chdir'd before accessing the debug info.
This commit is contained in:
parent
aee4bf8505
commit
04affae3ef
9 changed files with 94 additions and 26 deletions
|
@ -1,3 +1,13 @@
|
|||
2013-12-02 Doug Evans <dje@google.com>
|
||||
Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* objfiles.c (allocate_objfile): Save original_name as an absolute
|
||||
path.
|
||||
* objfiles.h (struct objfile): Expand comment on original_name.
|
||||
* source.c (openp): Call gdb_abspath.
|
||||
* utils.c (gdb_abspath): New function.
|
||||
* utils.h (gdb_abspath): Declare.
|
||||
|
||||
2013-12-02 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* dcache.c (dcache_read_line): Use target_read_raw_memory.
|
||||
|
|
|
@ -272,6 +272,7 @@ struct objfile *
|
|||
allocate_objfile (bfd *abfd, const char *name, int flags)
|
||||
{
|
||||
struct objfile *objfile;
|
||||
char *expanded_name;
|
||||
|
||||
objfile = (struct objfile *) xzalloc (sizeof (struct objfile));
|
||||
objfile->psymbol_cache = psymbol_bcache_init ();
|
||||
|
@ -286,10 +287,20 @@ allocate_objfile (bfd *abfd, const char *name, int flags)
|
|||
{
|
||||
gdb_assert (abfd == NULL);
|
||||
gdb_assert ((flags & OBJF_NOT_FILENAME) != 0);
|
||||
name = "<<anonymous objfile>>";
|
||||
expanded_name = xstrdup ("<<anonymous objfile>>");
|
||||
}
|
||||
objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, name,
|
||||
strlen (name));
|
||||
else if ((flags & OBJF_NOT_FILENAME) != 0)
|
||||
expanded_name = xstrdup (name);
|
||||
else
|
||||
expanded_name = gdb_abspath (name);
|
||||
objfile->original_name = obstack_copy0 (&objfile->objfile_obstack,
|
||||
expanded_name,
|
||||
strlen (expanded_name));
|
||||
xfree (expanded_name);
|
||||
|
||||
/* Update the per-objfile information that comes from the bfd, ensuring
|
||||
that any data that is reference is saved in the per-objfile data
|
||||
region. */
|
||||
|
||||
/* Update the per-objfile information that comes from the bfd, ensuring
|
||||
that any data that is reference is saved in the per-objfile data
|
||||
|
|
|
@ -212,8 +212,10 @@ struct objfile
|
|||
|
||||
struct objfile *next;
|
||||
|
||||
/* The object file's name, tilde-expanded and absolute. This
|
||||
pointer is never NULL. This does not have to be freed; it is
|
||||
/* The object file's original name as specified by the user,
|
||||
made absolute, and tilde-expanded. However, it is not canonicalized
|
||||
(i.e., it has not been passed through gdb_realpath).
|
||||
This pointer is never NULL. This does not have to be freed; it is
|
||||
guaranteed to have a lifetime at least as long as the objfile. */
|
||||
|
||||
char *original_name;
|
||||
|
|
24
gdb/source.c
24
gdb/source.c
|
@ -853,28 +853,10 @@ done:
|
|||
/* If a file was opened, canonicalize its filename. */
|
||||
if (fd < 0)
|
||||
*filename_opened = NULL;
|
||||
else if ((opts & OPF_RETURN_REALPATH) != 0)
|
||||
*filename_opened = gdb_realpath (filename);
|
||||
else
|
||||
{
|
||||
char *(*realpath_fptr) (const char *);
|
||||
|
||||
realpath_fptr = ((opts & OPF_RETURN_REALPATH) != 0
|
||||
? gdb_realpath : xstrdup);
|
||||
|
||||
if (IS_ABSOLUTE_PATH (filename))
|
||||
*filename_opened = realpath_fptr (filename);
|
||||
else
|
||||
{
|
||||
/* Beware the // my son, the Emacs barfs, the botch that catch... */
|
||||
|
||||
char *f = concat (current_directory,
|
||||
IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
|
||||
? "" : SLASH_STRING,
|
||||
filename, (char *)NULL);
|
||||
|
||||
*filename_opened = realpath_fptr (f);
|
||||
xfree (f);
|
||||
}
|
||||
}
|
||||
*filename_opened = gdb_abspath (filename);
|
||||
}
|
||||
|
||||
return fd;
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2013-12-02 Doug Evans <dje@google.com>
|
||||
|
||||
* gdb.dwarf/dwp-symlink.c: Fake out gdb to not load debug info
|
||||
at start.
|
||||
* gdb.dwarf/dwp-symlink.exp: Test trying to load dwp when the binary
|
||||
has been specified with a relative path and we have chdir'd before
|
||||
accessing the debug info.
|
||||
|
||||
2013-11-28 Andrew Burgess <aburgess@broadcom.com>
|
||||
|
||||
* gdb.trace/unavailable.exp (gdb_collect_args_test): Update
|
||||
|
|
|
@ -15,6 +15,13 @@
|
|||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Cheezy hack to prevent set_initial_language from trying to look up main.
|
||||
We do this so that gdb won't try to open the dwp file when the file is
|
||||
first selected. This gives us a chance to do a chdir before attempting
|
||||
to access the debug info. */
|
||||
asm (".globl main.main");
|
||||
asm ("main.main: .byte 0");
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
|
|
|
@ -75,3 +75,23 @@ gdb_test "ptype main" {type = int \(\)} "binary default, dwp at symlink"
|
|||
clean_restart "$thelink"
|
||||
|
||||
gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp at symlink"
|
||||
|
||||
# Verify we can still find the dwp if we change directories and we specified
|
||||
# a relative path for the program.
|
||||
|
||||
set saved_pwd [pwd]
|
||||
|
||||
# This is clean_restart, but specifying a relative path to the binary.
|
||||
gdb_exit
|
||||
gdb_start
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
gdb_test "cd [file dirname [standard_output_file ${thelink}]]" \
|
||||
"Working directory .*"
|
||||
gdb_load "./${thelink}"
|
||||
|
||||
gdb_test "cd .." "Working directory .*"
|
||||
|
||||
gdb_test "ptype main" {type = int \(int, char \*\*\)} \
|
||||
"relative path, binary symlink, dwp at symlink"
|
||||
|
||||
cd $saved_pwd
|
||||
|
|
26
gdb/utils.c
26
gdb/utils.c
|
@ -3274,6 +3274,32 @@ gdb_realpath_keepfile (const char *filename)
|
|||
return result;
|
||||
}
|
||||
|
||||
/* Return PATH in absolute form, performing tilde-expansion if necessary.
|
||||
PATH cannot be NULL or the empty string.
|
||||
This does not resolve symlinks however, use gdb_realpath for that.
|
||||
Space for the result is allocated with malloc.
|
||||
If the path is already absolute, it is strdup'd.
|
||||
If there is a problem computing the absolute path, the path is returned
|
||||
unchanged (still strdup'd). */
|
||||
|
||||
char *
|
||||
gdb_abspath (const char *path)
|
||||
{
|
||||
gdb_assert (path != NULL && path[0] != '\0');
|
||||
|
||||
if (path[0] == '~')
|
||||
return tilde_expand (path);
|
||||
|
||||
if (IS_ABSOLUTE_PATH (path))
|
||||
return xstrdup (path);
|
||||
|
||||
/* Beware the // my son, the Emacs barfs, the botch that catch... */
|
||||
return concat (current_directory,
|
||||
IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
|
||||
? "" : SLASH_STRING,
|
||||
path, (char *) NULL);
|
||||
}
|
||||
|
||||
ULONGEST
|
||||
align_up (ULONGEST v, int n)
|
||||
{
|
||||
|
|
|
@ -130,6 +130,8 @@ extern char *gdb_realpath (const char *);
|
|||
|
||||
extern char *gdb_realpath_keepfile (const char *);
|
||||
|
||||
extern char *gdb_abspath (const char *);
|
||||
|
||||
extern int gdb_filename_fnmatch (const char *pattern, const char *string,
|
||||
int flags);
|
||||
|
||||
|
|
Loading…
Reference in a new issue