mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-29 15:18:34 +08:00
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:
@ -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>
|
2013-12-02 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* dcache.c (dcache_read_line): Use target_read_raw_memory.
|
* 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)
|
allocate_objfile (bfd *abfd, const char *name, int flags)
|
||||||
{
|
{
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
|
char *expanded_name;
|
||||||
|
|
||||||
objfile = (struct objfile *) xzalloc (sizeof (struct objfile));
|
objfile = (struct objfile *) xzalloc (sizeof (struct objfile));
|
||||||
objfile->psymbol_cache = psymbol_bcache_init ();
|
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 (abfd == NULL);
|
||||||
gdb_assert ((flags & OBJF_NOT_FILENAME) != 0);
|
gdb_assert ((flags & OBJF_NOT_FILENAME) != 0);
|
||||||
name = "<<anonymous objfile>>";
|
expanded_name = xstrdup ("<<anonymous objfile>>");
|
||||||
}
|
}
|
||||||
objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, name,
|
else if ((flags & OBJF_NOT_FILENAME) != 0)
|
||||||
strlen (name));
|
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
|
/* Update the per-objfile information that comes from the bfd, ensuring
|
||||||
that any data that is reference is saved in the per-objfile data
|
that any data that is reference is saved in the per-objfile data
|
||||||
|
@ -212,8 +212,10 @@ struct objfile
|
|||||||
|
|
||||||
struct objfile *next;
|
struct objfile *next;
|
||||||
|
|
||||||
/* The object file's name, tilde-expanded and absolute. This
|
/* The object file's original name as specified by the user,
|
||||||
pointer is never NULL. This does not have to be freed; it is
|
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. */
|
guaranteed to have a lifetime at least as long as the objfile. */
|
||||||
|
|
||||||
char *original_name;
|
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 a file was opened, canonicalize its filename. */
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
*filename_opened = NULL;
|
*filename_opened = NULL;
|
||||||
|
else if ((opts & OPF_RETURN_REALPATH) != 0)
|
||||||
|
*filename_opened = gdb_realpath (filename);
|
||||||
else
|
else
|
||||||
{
|
*filename_opened = gdb_abspath (filename);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return fd;
|
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>
|
2013-11-28 Andrew Burgess <aburgess@broadcom.com>
|
||||||
|
|
||||||
* gdb.trace/unavailable.exp (gdb_collect_args_test): Update
|
* 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
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
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
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -75,3 +75,23 @@ gdb_test "ptype main" {type = int \(\)} "binary default, dwp at symlink"
|
|||||||
clean_restart "$thelink"
|
clean_restart "$thelink"
|
||||||
|
|
||||||
gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp at symlink"
|
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 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
|
ULONGEST
|
||||||
align_up (ULONGEST v, int n)
|
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_realpath_keepfile (const char *);
|
||||||
|
|
||||||
|
extern char *gdb_abspath (const char *);
|
||||||
|
|
||||||
extern int gdb_filename_fnmatch (const char *pattern, const char *string,
|
extern int gdb_filename_fnmatch (const char *pattern, const char *string,
|
||||||
int flags);
|
int flags);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user