[gdb/f20] Backport several gdb-7.6.x stable branch fixes (BZ 1055155).
Jan Kratochvil
jankratochvil at fedoraproject.org
Sun Jan 19 18:36:05 UTC 2014
commit b2b7558c354fdbd23534265486560d12958dae88
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date: Sun Jan 19 19:36:15 2014 +0100
Backport several gdb-7.6.x stable branch fixes (BZ 1055155).
gdb-6.6-buildid-locate-rpm.patch | 8 +-
gdb-6.6-buildid-locate.patch | 12 +-
gdb-upstream.patch | 858 ++++++++++++++++++++++++++++++++++++++
gdb.spec | 5 +-
4 files changed, 872 insertions(+), 11 deletions(-)
---
diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch
index 01e560d..3192ee1 100644
--- a/gdb-6.6-buildid-locate-rpm.patch
+++ b/gdb-6.6-buildid-locate-rpm.patch
@@ -429,17 +429,17 @@ Index: gdb-7.6.50.20130731-cvs/gdb/elfread.c
+#ifdef HAVE_LIBRPM
+ if (missing_exec == MISSING_EXEC_NOT_TRIED)
+ {
-+ char *exec_filename;
++ char *execfilename;
- fprintf_unfiltered (gdb_stdlog,
- _("Missing separate debuginfo for %s\n"), binary);
- if (debug != NULL)
- fprintf_unfiltered (gdb_stdlog, _("Try to install the hash file %s\n"),
- debug);
-+ exec_filename = get_exec_file (0);
-+ if (exec_filename != NULL)
++ execfilename = get_exec_file (0);
++ if (execfilename != NULL)
+ {
-+ if (missing_rpm_enlist (exec_filename) == 0)
++ if (missing_rpm_enlist (execfilename) == 0)
+ missing_exec = MISSING_EXEC_NOT_FOUND;
+ else
+ missing_exec = MISSING_EXEC_ENLISTED;
diff --git a/gdb-6.6-buildid-locate.patch b/gdb-6.6-buildid-locate.patch
index 2a5517f..0b967fd 100644
--- a/gdb-6.6-buildid-locate.patch
+++ b/gdb-6.6-buildid-locate.patch
@@ -23,7 +23,7 @@ Index: gdb-7.6.50.20130731-cvs/gdb/corelow.c
+{
+ CORE_ADDR at_entry;
+ struct elf_build_id *build_id;
-+ char *exec_filename, *debug_filename;
++ char *execfilename, *debug_filename;
+ char *build_id_filename;
+ struct cleanup *back_to;
+
@@ -44,14 +44,14 @@ Index: gdb-7.6.50.20130731-cvs/gdb/corelow.c
+ file - such .eh_frame would not be found if SYMFILE_OBJFILE would refer
+ directly to the separate debug info file. */
+
-+ exec_filename = build_id_to_filename (build_id, &build_id_filename, 0);
++ execfilename = build_id_to_filename (build_id, &build_id_filename, 0);
+ make_cleanup (xfree, build_id_filename);
+
-+ if (exec_filename != NULL)
++ if (execfilename != NULL)
+ {
-+ make_cleanup (xfree, exec_filename);
-+ exec_file_attach (exec_filename, from_tty);
-+ symbol_file_add_main (exec_filename, from_tty);
++ make_cleanup (xfree, execfilename);
++ exec_file_attach (execfilename, from_tty);
++ symbol_file_add_main (execfilename, from_tty);
+ if (symfile_objfile != NULL)
+ symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED;
+ }
diff --git a/gdb-upstream.patch b/gdb-upstream.patch
index da4c127..72bcce4 100644
--- a/gdb-upstream.patch
+++ b/gdb-upstream.patch
@@ -201,3 +201,861 @@ index 93246b3..c2d271a 100644
for (i = 0; i < count; i++)
{
+
+
+
+commit 9a95e75ee9944cbe6fe3021b92a7c4de87be6fe1
+Author: Yao Qi <yao at codesourcery.com>
+Date: Wed Aug 14 11:53:11 2013 +0000
+
+ gdb/
+
+ PR gdb/15837:
+ * frame.h (read_frame_local): Declare.
+ * mi/mi-cmd-stack.c (list_args_or_locals): Call
+ read_frame_local.
+ * stack.c (read_frame_local): New.
+
+### a/gdb/ChangeLog
+### b/gdb/ChangeLog
+## -1,3 +1,11 @@
++2013-08-14 Yao Qi <yao at codesourcery.com>
++
++ PR gdb/15837:
++ * frame.h (read_frame_local): Declare.
++ * mi/mi-cmd-stack.c (list_args_or_locals): Call
++ read_frame_local.
++ * stack.c (read_frame_local): New.
++
+ 2013-06-28 Pedro Alves <palves at redhat.com>
+
+ PR tui/14880
+--- a/gdb/frame.h
++++ b/gdb/frame.h
+@@ -714,6 +714,8 @@ struct frame_arg
+ extern void read_frame_arg (struct symbol *sym, struct frame_info *frame,
+ struct frame_arg *argp,
+ struct frame_arg *entryargp);
++extern void read_frame_local (struct symbol *sym, struct frame_info *frame,
++ struct frame_arg *argp);
+
+ extern void args_info (char *, int);
+
+--- a/gdb/mi/mi-cmd-stack.c
++++ b/gdb/mi/mi-cmd-stack.c
+@@ -417,7 +417,10 @@ list_args_or_locals (enum what_to_list what, enum print_values values,
+ && TYPE_CODE (type) != TYPE_CODE_UNION)
+ {
+ case PRINT_ALL_VALUES:
+- read_frame_arg (sym2, fi, &arg, &entryarg);
++ if (SYMBOL_IS_ARGUMENT (sym))
++ read_frame_arg (sym2, fi, &arg, &entryarg);
++ else
++ read_frame_local (sym2, fi, &arg);
+ }
+ break;
+ }
+--- a/gdb/stack.c
++++ b/gdb/stack.c
+@@ -296,6 +296,27 @@ print_frame_arg (const struct frame_arg *arg)
+ annotate_arg_end ();
+ }
+
++/* Read in inferior function local SYM at FRAME into ARGP. Caller is
++ responsible for xfree of ARGP->ERROR. This function never throws an
++ exception. */
++
++void
++read_frame_local (struct symbol *sym, struct frame_info *frame,
++ struct frame_arg *argp)
++{
++ volatile struct gdb_exception except;
++ struct value *val = NULL;
++
++ TRY_CATCH (except, RETURN_MASK_ERROR)
++ {
++ val = read_var_value (sym, frame);
++ }
++
++ argp->error = (val == NULL) ? xstrdup (except.message) : NULL;
++ argp->sym = sym;
++ argp->val = val;
++}
++
+ /* Read in inferior function parameter SYM at FRAME into ARGP. Caller is
+ responsible for xfree of ARGP->ERROR. This function never throws an
+ exception. */
+
+
+
+commit 4b0f5fbb253fbbe9c2f4578ebd7dd94204a46477
+Author: Jan Kratochvil <jan.kratochvil at redhat.com>
+Date: Thu Aug 29 14:24:16 2013 +0000
+
+ PR server/15604
+
+ gdb/gdbserver/
+ 2013-08-29 Jan Kratochvil <jan.kratochvil at redhat.com>
+
+ PR server/15604
+ * linux-low.c
+ (linux_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
+ Close LISTEN_DESC and optionally REMOTE_DESC.
+ (lynx_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
+ Close LISTEN_DESC and optionally REMOTE_DESC.
+ * remote-utils.c (remote_desc, listen_desc): Remove static qualifier.
+ * server.h (remote_desc, listen_desc): New declaration.
+ * spu-low.c
+ (spu_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
+ Close LISTEN_DESC and optionally REMOTE_DESC.
+
+### a/gdb/gdbserver/ChangeLog
+### b/gdb/gdbserver/ChangeLog
+## -1,3 +1,17 @@
++2013-08-29 Jan Kratochvil <jan.kratochvil at redhat.com>
++
++ PR server/15604
++ * linux-low.c
++ (linux_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
++ Close LISTEN_DESC and optionally REMOTE_DESC.
++ (lynx_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
++ Close LISTEN_DESC and optionally REMOTE_DESC.
++ * remote-utils.c (remote_desc, listen_desc): Remove static qualifier.
++ * server.h (remote_desc, listen_desc): New declaration.
++ * spu-low.c
++ (spu_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
++ Close LISTEN_DESC and optionally REMOTE_DESC.
++
+ 2013-05-31 Doug Evans <dje at google.com>
+
+ PR server/15594
+--- a/gdb/gdbserver/linux-low.c
++++ b/gdb/gdbserver/linux-low.c
+@@ -668,6 +668,12 @@ linux_create_inferior (char *program, char **allargs)
+ /* Errors ignored. */;
+ }
+ }
++ else
++ {
++ close (listen_desc);
++ if (gdb_connected ())
++ close (remote_desc);
++ }
+
+ execv (program, allargs);
+ if (errno == ENOENT)
+--- a/gdb/gdbserver/lynx-low.c
++++ b/gdb/gdbserver/lynx-low.c
+@@ -218,6 +218,12 @@ lynx_create_inferior (char *program, char **allargs)
+ pgrp = getpid();
+ setpgid (0, pgrp);
+ ioctl (0, TIOCSPGRP, &pgrp);
++ if (!remote_connection_is_stdio ())
++ {
++ close (listen_desc);
++ if (gdb_connected ())
++ close (remote_desc);
++ }
+ lynx_ptrace (PTRACE_TRACEME, null_ptid, 0, 0, 0);
+ execv (program, allargs);
+ fprintf (stderr, "Cannot exec %s: %s.\n", program, strerror (errno));
+--- a/gdb/gdbserver/remote-utils.c
++++ b/gdb/gdbserver/remote-utils.c
+@@ -108,8 +108,8 @@ struct ui_file *gdb_stdlog;
+
+ static int remote_is_stdio = 0;
+
+-static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
+-static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
++gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
++gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
+
+ /* FIXME headerize? */
+ extern int using_threads;
+--- a/gdb/gdbserver/server.h
++++ b/gdb/gdbserver/server.h
+@@ -274,6 +274,8 @@ extern void hostio_last_error_from_errno (char *own_buf);
+ /* From remote-utils.c */
+
+ extern int remote_debug;
++extern gdb_fildes_t remote_desc;
++extern gdb_fildes_t listen_desc;
+ extern int noack_mode;
+ extern int transport_is_reliable;
+
+--- a/gdb/gdbserver/spu-low.c
++++ b/gdb/gdbserver/spu-low.c
+@@ -273,6 +273,12 @@ spu_create_inferior (char *program, char **allargs)
+
+ if (pid == 0)
+ {
++ if (!remote_connection_is_stdio ())
++ {
++ close (listen_desc);
++ if (gdb_connected ())
++ close (remote_desc);
++ }
+ ptrace (PTRACE_TRACEME, 0, 0, 0);
+
+ setpgid (0, 0);
+
+
+
+commit 510604eee7892c54d98eefa2893afb823c721406
+Author: Jan Kratochvil <jan.kratochvil at redhat.com>
+Date: Wed Aug 28 17:55:56 2013 +0000
+
+ PR gdb/15415
+
+ gdb/
+ 2013-08-27 Jan Kratochvil <jan.kratochvil at redhat.com>
+
+ PR gdb/15415
+ * corefile.c (get_exec_file): Use exec_filename.
+ * defs.h (OPF_DISABLE_REALPATH): New definition. Add new comment.
+ * exec.c (exec_close): Free EXEC_FILENAME.
+ (exec_file_attach): New variable canonical_pathname. Use
+ OPF_DISABLE_REALPATH. Call gdb_realpath explicitly. Set
+ EXEC_FILENAME.
+ * exec.h (exec_filename): New.
+ * inferior.c (print_inferior, inferior_command): Use
+ PSPACE_EXEC_FILENAME.
+ * mi/mi-main.c (print_one_inferior): Likewise.
+ * progspace.c (clone_program_space, print_program_space): Likewise.
+ * progspace.h (struct program_space): New field pspace_exec_filename.
+ * source.c (openp): Describe OPF_DISABLE_REALPATH. New variable
+ realpath_fptr, initialize it from OPF_DISABLE_REALPATH, use it.
+
+ gdb/testsuite/
+ 2013-08-27 Jan Kratochvil <jan.kratochvil at redhat.com>
+
+ PR gdb/15415
+ * gdb.base/argv0-symlink.c: New file.
+ * gdb.base/argv0-symlink.exp: New file.
+
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/corefile.c gdb-7.6.50.20130731-cvs/gdb/corefile.c
+--- gdb-7.6.50.20130731-cvs-orig/gdb/corefile.c 2013-07-31 21:41:54.000000000 +0200
++++ gdb-7.6.50.20130731-cvs/gdb/corefile.c 2014-01-19 16:24:46.238323054 +0100
+@@ -182,8 +182,8 @@ validate_files (void)
+ char *
+ get_exec_file (int err)
+ {
+- if (exec_bfd)
+- return bfd_get_filename (exec_bfd);
++ if (exec_filename)
++ return exec_filename;
+ if (!err)
+ return NULL;
+
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/defs.h gdb-7.6.50.20130731-cvs/gdb/defs.h
+--- gdb-7.6.50.20130731-cvs-orig/gdb/defs.h 2013-07-31 21:41:54.000000000 +0200
++++ gdb-7.6.50.20130731-cvs/gdb/defs.h 2014-01-19 16:24:46.239323054 +0100
+@@ -346,8 +346,10 @@ extern const char *pc_prefix (CORE_ADDR)
+
+ /* From source.c */
+
++/* See openp function definition for their description. */
+ #define OPF_TRY_CWD_FIRST 0x01
+ #define OPF_SEARCH_IN_PATH 0x02
++#define OPF_DISABLE_REALPATH 0x04
+
+ extern int openp (const char *, int, const char *, int, char **);
+
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/exec.c gdb-7.6.50.20130731-cvs/gdb/exec.c
+--- gdb-7.6.50.20130731-cvs-orig/gdb/exec.c 2013-07-31 21:41:54.000000000 +0200
++++ gdb-7.6.50.20130731-cvs/gdb/exec.c 2014-01-19 16:25:18.616315354 +0100
+@@ -102,6 +102,9 @@ exec_close (void)
+ exec_bfd_mtime = 0;
+
+ remove_target_sections (&exec_bfd);
++
++ xfree (exec_filename);
++ exec_filename = NULL;
+ }
+ }
+
+@@ -179,12 +182,13 @@ exec_file_attach (char *filename, int fr
+ else
+ {
+ struct cleanup *cleanups;
+- char *scratch_pathname;
++ char *scratch_pathname, *canonical_pathname;
+ int scratch_chan;
+ struct target_section *sections = NULL, *sections_end = NULL;
+ char **matching;
+
+- scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename,
++ scratch_chan = openp (getenv ("PATH"),
++ OPF_TRY_CWD_FIRST | OPF_DISABLE_REALPATH, filename,
+ write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
+ &scratch_pathname);
+ #if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__)
+@@ -193,7 +197,9 @@ exec_file_attach (char *filename, int fr
+ char *exename = alloca (strlen (filename) + 5);
+
+ strcat (strcpy (exename, filename), ".exe");
+- scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, exename,
++ scratch_chan = openp (getenv ("PATH"),
++ OPF_TRY_CWD_FIRST | OPF_DISABLE_REALPATH,
++ exename,
+ write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
+ &scratch_pathname);
+ }
+@@ -203,11 +209,16 @@ exec_file_attach (char *filename, int fr
+
+ cleanups = make_cleanup (xfree, scratch_pathname);
+
++ /* gdb_bfd_open (and its variants) prefers canonicalized pathname for
++ better BFD caching. */
++ canonical_pathname = gdb_realpath (scratch_pathname);
++ make_cleanup (xfree, canonical_pathname);
++
+ if (write_files)
+- exec_bfd = gdb_bfd_fopen (scratch_pathname, gnutarget,
++ exec_bfd = gdb_bfd_fopen (canonical_pathname, gnutarget,
+ FOPEN_RUB, scratch_chan);
+ else
+- exec_bfd = gdb_bfd_open (scratch_pathname, gnutarget, scratch_chan);
++ exec_bfd = gdb_bfd_open (canonical_pathname, gnutarget, scratch_chan);
+
+ if (!exec_bfd)
+ {
+@@ -215,6 +226,9 @@ exec_file_attach (char *filename, int fr
+ scratch_pathname, bfd_errmsg (bfd_get_error ()));
+ }
+
++ gdb_assert (exec_filename == NULL);
++ exec_filename = xstrdup (scratch_pathname);
++
+ if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
+ {
+ /* Make sure to close exec_bfd, or else "run" might try to use
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/exec.h gdb-7.6.50.20130731-cvs/gdb/exec.h
+--- gdb-7.6.50.20130731-cvs-orig/gdb/exec.h 2013-07-31 21:41:54.000000000 +0200
++++ gdb-7.6.50.20130731-cvs/gdb/exec.h 2014-01-19 16:24:46.262323049 +0100
+@@ -32,6 +32,7 @@ extern struct target_ops exec_ops;
+
+ #define exec_bfd current_program_space->ebfd
+ #define exec_bfd_mtime current_program_space->ebfd_mtime
++#define exec_filename current_program_space->pspace_exec_filename
+
+ /* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
+ Returns 0 if OK, 1 on error. */
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/inferior.c gdb-7.6.50.20130731-cvs/gdb/inferior.c
+--- gdb-7.6.50.20130731-cvs-orig/gdb/inferior.c 2013-07-31 21:41:54.000000000 +0200
++++ gdb-7.6.50.20130731-cvs/gdb/inferior.c 2014-01-19 16:24:46.264323048 +0100
+@@ -588,9 +588,8 @@ print_inferior (struct ui_out *uiout, ch
+ ui_out_field_string (uiout, "target-id",
+ inferior_pid_to_str (inf->pid));
+
+- if (inf->pspace->ebfd)
+- ui_out_field_string (uiout, "exec",
+- bfd_get_filename (inf->pspace->ebfd));
++ if (inf->pspace->pspace_exec_filename != NULL)
++ ui_out_field_string (uiout, "exec", inf->pspace->pspace_exec_filename);
+ else
+ ui_out_field_skip (uiout, "exec");
+
+@@ -704,8 +703,8 @@ inferior_command (char *args, int from_t
+ printf_filtered (_("[Switching to inferior %d [%s] (%s)]\n"),
+ inf->num,
+ inferior_pid_to_str (inf->pid),
+- (inf->pspace->ebfd
+- ? bfd_get_filename (inf->pspace->ebfd)
++ (inf->pspace->pspace_exec_filename != NULL
++ ? inf->pspace->pspace_exec_filename
+ : _("<noexec>")));
+
+ if (inf->pid != 0)
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/mi/mi-main.c gdb-7.6.50.20130731-cvs/gdb/mi/mi-main.c
+--- gdb-7.6.50.20130731-cvs-orig/gdb/mi/mi-main.c 2013-07-31 21:41:54.000000000 +0200
++++ gdb-7.6.50.20130731-cvs/gdb/mi/mi-main.c 2014-01-19 16:24:46.273323046 +0100
+@@ -573,10 +573,10 @@ print_one_inferior (struct inferior *inf
+ if (inferior->pid != 0)
+ ui_out_field_int (uiout, "pid", inferior->pid);
+
+- if (inferior->pspace->ebfd)
++ if (inferior->pspace->pspace_exec_filename != NULL)
+ {
+ ui_out_field_string (uiout, "executable",
+- bfd_get_filename (inferior->pspace->ebfd));
++ inferior->pspace->pspace_exec_filename);
+ }
+
+ data.cores = 0;
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/progspace.c gdb-7.6.50.20130731-cvs/gdb/progspace.c
+--- gdb-7.6.50.20130731-cvs-orig/gdb/progspace.c 2013-01-02 02:54:56.000000000 +0100
++++ gdb-7.6.50.20130731-cvs/gdb/progspace.c 2014-01-19 16:24:46.275323045 +0100
+@@ -196,8 +196,8 @@ clone_program_space (struct program_spac
+
+ set_current_program_space (dest);
+
+- if (src->ebfd != NULL)
+- exec_file_attach (bfd_get_filename (src->ebfd), 0);
++ if (src->pspace_exec_filename != NULL)
++ exec_file_attach (src->pspace_exec_filename, 0);
+
+ if (src->symfile_object_file != NULL)
+ symbol_file_add_main (src->symfile_object_file->name, 0);
+@@ -336,9 +336,8 @@ print_program_space (struct ui_out *uiou
+
+ ui_out_field_int (uiout, "id", pspace->num);
+
+- if (pspace->ebfd)
+- ui_out_field_string (uiout, "exec",
+- bfd_get_filename (pspace->ebfd));
++ if (pspace->pspace_exec_filename)
++ ui_out_field_string (uiout, "exec", pspace->pspace_exec_filename);
+ else
+ ui_out_field_skip (uiout, "exec");
+
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/progspace.h gdb-7.6.50.20130731-cvs/gdb/progspace.h
+--- gdb-7.6.50.20130731-cvs-orig/gdb/progspace.h 2013-01-02 02:54:56.000000000 +0100
++++ gdb-7.6.50.20130731-cvs/gdb/progspace.h 2014-01-19 16:24:46.276323045 +0100
+@@ -148,6 +148,10 @@ struct program_space
+ bfd *ebfd;
+ /* The last-modified time, from when the exec was brought in. */
+ long ebfd_mtime;
++ /* Similar to bfd_get_filename (exec_bfd) but in original form given
++ by user, without symbolic links and pathname resolved.
++ It needs to be freed by xfree. It is not NULL iff EBFD is not NULL. */
++ char *pspace_exec_filename;
+
+ /* The address space attached to this program space. More than one
+ program space may be bound to the same address space. In the
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/source.c gdb-7.6.50.20130731-cvs/gdb/source.c
+--- gdb-7.6.50.20130731-cvs-orig/gdb/source.c 2013-07-31 21:41:54.000000000 +0200
++++ gdb-7.6.50.20130731-cvs/gdb/source.c 2014-01-19 16:24:46.278323045 +0100
+@@ -692,6 +692,11 @@ is_regular_file (const char *name)
+ and the file, sigh! Emacs gets confuzzed by this when we print the
+ source file name!!!
+
++ If OPTS does not have OPF_DISABLE_REALPATH set return FILENAME_OPENED
++ resolved by gdb_realpath. Even with OPF_DISABLE_REALPATH this function
++ still returns filename starting with "/". If FILENAME_OPENED is NULL
++ this option has no effect.
++
+ If a file is found, return the descriptor.
+ Otherwise, return -1, with errno set for the last name we tried to open. */
+
+@@ -851,19 +856,27 @@ done:
+ /* If a file was opened, canonicalize its filename. */
+ if (fd < 0)
+ *filename_opened = NULL;
+- else if (IS_ABSOLUTE_PATH (filename))
+- *filename_opened = gdb_realpath (filename);
+ else
+ {
+- /* Beware the // my son, the Emacs barfs, the botch that catch... */
++ char *(*realpath_fptr) (const char *);
+
+- char *f = concat (current_directory,
+- IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
+- ? "" : SLASH_STRING,
+- filename, (char *)NULL);
++ realpath_fptr = ((opts & OPF_DISABLE_REALPATH) != 0
++ ? xstrdup : gdb_realpath);
+
+- *filename_opened = gdb_realpath (f);
+- xfree (f);
++ 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);
++ }
+ }
+ }
+
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/testsuite/gdb.base/argv0-symlink.c gdb-7.6.50.20130731-cvs/gdb/testsuite/gdb.base/argv0-symlink.c
+--- gdb-7.6.50.20130731-cvs-orig/gdb/testsuite/gdb.base/argv0-symlink.c 1970-01-01 01:00:00.000000000 +0100
++++ gdb-7.6.50.20130731-cvs/gdb/testsuite/gdb.base/argv0-symlink.c 2014-01-19 16:24:46.286323043 +0100
+@@ -0,0 +1,22 @@
++/* This testcase is part of GDB, the GNU debugger.
++
++ Copyright 2013 Free Software Foundation, Inc.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see <http://www.gnu.org/licenses/>. */
++
++int
++main (int argc, char **argv)
++{
++ return 0;
++}
+diff -dup -ruNp gdb-7.6.50.20130731-cvs-orig/gdb/testsuite/gdb.base/argv0-symlink.exp gdb-7.6.50.20130731-cvs/gdb/testsuite/gdb.base/argv0-symlink.exp
+--- gdb-7.6.50.20130731-cvs-orig/gdb/testsuite/gdb.base/argv0-symlink.exp 1970-01-01 01:00:00.000000000 +0100
++++ gdb-7.6.50.20130731-cvs/gdb/testsuite/gdb.base/argv0-symlink.exp 2014-01-19 16:24:46.287323043 +0100
+@@ -0,0 +1,62 @@
++# Copyright 2013 Free Software Foundation, Inc.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++standard_testfile
++
++if { [build_executable ${testfile}.exp ${testfile} ${srcfile}] == -1 } {
++ return -1
++}
++
++set test "kept file symbolic link name"
++set filelink "${testfile}-filelink"
++
++remote_file host delete [standard_output_file $filelink]
++set status [remote_exec host "ln -sf ${testfile} [standard_output_file $filelink]"]
++if {[lindex $status 0] != 0} {
++ unsupported "$test (host does not support symbolic links)"
++ return 0
++}
++
++clean_restart "$filelink"
++
++if ![runto_main] {
++ untested "could not run to main"
++ return -1
++}
++
++gdb_test {print argv[0]} "/$filelink\"" $test
++
++
++set test "kept directory symbolic link name"
++set dirlink "${testfile}-dirlink"
++
++# 'ln -sf' does not overwrite symbol link to a directory.
++# 'remote_file host delete' uses stat (not lstat), therefore it refuses to
++# delete a directory.
++remote_exec host "rm -f [standard_output_file $dirlink]"
++set status [remote_exec host "ln -sf . [standard_output_file $dirlink]"]
++if {[lindex $status 0] != 0} {
++ unsupported "$test (host does not support symbolic links)"
++ return 0
++}
++
++clean_restart "$dirlink/$filelink"
++
++if ![runto_main] {
++ untested "could not run to main"
++ return -1
++}
++
++gdb_test {print argv[0]} "/$dirlink/$filelink\"" $test
+
+
+
+commit 4856b6bc835e25ab0f48462104152701c864858c
+Author: Jan Kratochvil <jan.kratochvil at redhat.com>
+Date: Sun Oct 13 16:11:08 2013 +0000
+
+ Improve Executable displayed path (PR 15415 regression kind #2)
+
+ gdb/
+ 2013-10-13 Jan Kratochvil <jan.kratochvil at redhat.com>
+
+ Canonicalize directories for EXEC_FILENAME.
+ * exec.c (exec_file_attach): Use gdb_realpath_keepfile for
+ exec_filename.
+ * utils.c (gdb_realpath_keepfile): New function.
+ * utils.h (gdb_realpath_keepfile): New declaration.
+
+ gdb/testsuite/
+ 2013-10-13 Jan Kratochvil <jan.kratochvil at redhat.com>
+
+ Canonicalize directories for EXEC_FILENAME.
+ * gdb.base/argv0-symlink.exp
+ (kept file symbolic link name for info inferiors): New.
+ (kept directory symbolic link name): Setup kfail.
+ (kept directory symbolic link name for info inferiors): New.
+
+### a/gdb/ChangeLog
+### b/gdb/ChangeLog
+## -1,3 +1,11 @@
++2013-10-13 Jan Kratochvil <jan.kratochvil at redhat.com>
++
++ Canonicalize directories for EXEC_FILENAME.
++ * exec.c (exec_file_attach): Use gdb_realpath_keepfile for
++ exec_filename.
++ * utils.c (gdb_realpath_keepfile): New function.
++ * utils.h (gdb_realpath_keepfile): New declaration.
++
+ 2013-10-11 Doug Evans <dje at google.com>
+
+ * Makefile.in (GDBFLAGS): New variable.
+--- a/gdb/exec.c
++++ b/gdb/exec.c
+@@ -224,7 +224,7 @@ exec_file_attach (char *filename, int from_tty)
+ }
+
+ gdb_assert (exec_filename == NULL);
+- exec_filename = xstrdup (scratch_pathname);
++ exec_filename = gdb_realpath_keepfile (scratch_pathname);
+
+ if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
+ {
+### a/gdb/testsuite/ChangeLog
+### b/gdb/testsuite/ChangeLog
+## -1,3 +1,11 @@
++2013-10-13 Jan Kratochvil <jan.kratochvil at redhat.com>
++
++ Canonicalize directories for EXEC_FILENAME.
++ * gdb.base/argv0-symlink.exp
++ (kept file symbolic link name for info inferiors): New.
++ (kept directory symbolic link name): Setup kfail.
++ (kept directory symbolic link name for info inferiors): New.
++
+ 2013-10-11 Andreas Arnez <arnez at linux.vnet.ibm.com>
+
+ * gdb.arch/s390-multiarch.exp: New file.
+--- a/gdb/testsuite/gdb.base/argv0-symlink.exp
++++ b/gdb/testsuite/gdb.base/argv0-symlink.exp
+@@ -37,6 +37,7 @@ if ![runto_main] {
+ }
+
+ gdb_test {print argv[0]} "/$filelink\"" $test
++gdb_test "info inferiors" "/$subdir/$filelink *" "$test for info inferiors"
+
+
+ set test "kept directory symbolic link name"
+@@ -59,4 +60,9 @@ if ![runto_main] {
+ return -1
+ }
+
++# gdbserver does not have this issue.
++if ![is_remote target] {
++ setup_kfail "*-*-*" gdb/15934
++}
+ gdb_test {print argv[0]} "/$dirlink/$filelink\"" $test
++gdb_test "info inferiors" "/$subdir/$filelink *" "$test for info inferiors"
+--- a/gdb/utils.c
++++ b/gdb/utils.c
+@@ -3233,6 +3233,52 @@ gdb_realpath (const char *filename)
+ return xstrdup (filename);
+ }
+
++/* Return a copy of FILENAME, with its directory prefix canonicalized
++ by gdb_realpath. */
++
++char *
++gdb_realpath_keepfile (const char *filename)
++{
++ const char *base_name = lbasename (filename);
++ char *dir_name;
++ char *real_path;
++ char *result;
++
++ /* Extract the basename of filename, and return immediately
++ a copy of filename if it does not contain any directory prefix. */
++ if (base_name == filename)
++ return xstrdup (filename);
++
++ dir_name = alloca ((size_t) (base_name - filename + 2));
++ /* Allocate enough space to store the dir_name + plus one extra
++ character sometimes needed under Windows (see below), and
++ then the closing \000 character. */
++ strncpy (dir_name, filename, base_name - filename);
++ dir_name[base_name - filename] = '\000';
++
++#ifdef HAVE_DOS_BASED_FILE_SYSTEM
++ /* We need to be careful when filename is of the form 'd:foo', which
++ is equivalent of d:./foo, which is totally different from d:/foo. */
++ if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
++ {
++ dir_name[2] = '.';
++ dir_name[3] = '\000';
++ }
++#endif
++
++ /* Canonicalize the directory prefix, and build the resulting
++ filename. If the dirname realpath already contains an ending
++ directory separator, avoid doubling it. */
++ real_path = gdb_realpath (dir_name);
++ if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
++ result = concat (real_path, base_name, (char *) NULL);
++ else
++ result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
++
++ xfree (real_path);
++ return result;
++}
++
+ ULONGEST
+ align_up (ULONGEST v, int n)
+ {
+--- a/gdb/utils.h
++++ b/gdb/utils.h
+@@ -128,6 +128,8 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void);
+
+ extern char *gdb_realpath (const char *);
+
++extern char *gdb_realpath_keepfile (const char *);
++
+ extern int gdb_filename_fnmatch (const char *pattern, const char *string,
+ int flags);
+
+
+
+
+commit 24890efdabbd9d827cdd2088b022f070da04b14f
+Author: Tom Tromey <tromey at redhat.com>
+Date: Fri Oct 18 13:12:32 2013 -0600
+
+ fix argv0-symlink.exp for parallel mode
+
+ argv0-symlink.exp doesn't work properly if standard_output_file puts
+ files into a per-test subdirectory. That's because it assumes that
+ files appear in $subdir, which is no longer true.
+
+ This patch fixes the problem by computing the correct directory at
+ runtime.
+
+ Tested both with and without GDB_PARALLEL on x86-64 Fedora 18.
+
+ 2013-11-04 Tom Tromey <tromey at redhat.com>
+
+ * gdb.base/argv0-symlink.exp: Compute executable's directory
+ dynamically.
+
+### a/gdb/testsuite/ChangeLog
+### b/gdb/testsuite/ChangeLog
+## -1,5 +1,10 @@
+ 2013-11-04 Tom Tromey <tromey at redhat.com>
+
++ * gdb.base/argv0-symlink.exp: Compute executable's directory
++ dynamically.
++
++2013-11-04 Tom Tromey <tromey at redhat.com>
++
+ * gdb.asm/asm-source.exp: Use standard_output_file.
+
+ 2013-11-04 Tom Tromey <tromey at redhat.com>
+--- a/gdb/testsuite/gdb.base/argv0-symlink.exp
++++ b/gdb/testsuite/gdb.base/argv0-symlink.exp
+@@ -37,7 +37,14 @@ if ![runto_main] {
+ }
+
+ gdb_test {print argv[0]} "/$filelink\"" $test
+-gdb_test "info inferiors" "/$subdir/$filelink *" "$test for info inferiors"
++
++# For a link named /PATH/TO/DIR/LINK, we want to check the output
++# against "/DIR/LINK", but computed in a way that doesn't make
++# assumptions about the test directory layout.
++set full_filelink [standard_output_file $filelink]
++set lastdir [file tail [file dirname $full_filelink]]
++
++gdb_test "info inferiors" "/$lastdir/$filelink *" "$test for info inferiors"
+
+
+ set test "kept directory symbolic link name"
+@@ -65,4 +72,4 @@ if ![is_remote target] {
+ setup_kfail "*-*-*" gdb/15934
+ }
+ gdb_test {print argv[0]} "/$dirlink/$filelink\"" $test
+-gdb_test "info inferiors" "/$subdir/$filelink *" "$test for info inferiors"
++gdb_test "info inferiors" "/$lastdir/$filelink *" "$test for info inferiors"
+
+
+
+http://sourceware.org/ml/gdb-patches/2014-01/msg00722.html
+Subject: [patch] Fix gdb.base/argv0-symlink.exp FAIL in long dirpath
+
+
+--VbJkn9YxBvnuCH5J
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+Hi,
+
+when you build GDB in a very long directory pathname it will:
+
+(gdb) print argv[0]
+$1 = 0x7fffffffdb07 "/home/jkratoch/redhat/", 'x' <repeats 178 times>...
+(gdb) FAIL: gdb.base/argv0-symlink.exp: kept file symbolic link name
+
+With the fix:
+
+(gdb) print argv[0]
+$1 = 0x7fffffffdb07 "/home/jkratoch/redhat/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/gdb-test/gdb/testsuite/gdb.base/argv0-symlink-filelink"
+(gdb) PASS: gdb.base/argv0-symlink.exp: kept file symbolic link name
+
+The "set print repeats unlimited" part is there to prevent the following
+output, it would still PASS (as only its tail is matched) but it is not much
+correct.
+
+(gdb) print argv[0]
+$1 = 0x7fffffffdb07 "/home/jkratoch/redhat/", 'x' <repeats 195 times>, "/gdb-test/gdb/testsuite/gdb.base/argv0-symlink-filelink"
+(gdb) PASS: gdb.base/argv0-symlink.exp: kept file symbolic link name
+
+I will check it in.
+
+Tested on x86_64-fedora20-linux-gnu.
+
+
+Jan
+
+--VbJkn9YxBvnuCH5J
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline; filename="argv0.patch"
+
+gdb/testsuite/
+2014-01-19 Jan Kratochvil <jan.kratochvil at redhat.com>
+
+ Fix gdb.base/argv0-symlink.exp FAIL in long dirpath.
+ * gdb.base/argv0-symlink.exp (elements first, repeats first)
+ (elements second, repeats second): New.
+
+diff --git a/gdb/testsuite/gdb.base/argv0-symlink.exp b/gdb/testsuite/gdb.base/argv0-symlink.exp
+index 0e0202d..7bf5c2f 100644
+--- a/gdb/testsuite/gdb.base/argv0-symlink.exp
++++ b/gdb/testsuite/gdb.base/argv0-symlink.exp
+@@ -36,6 +36,10 @@ if ![runto_main] {
+ return -1
+ }
+
++# Very long directory paths could be cut below.
++gdb_test_no_output "set print elements unlimited" "elements first"
++gdb_test_no_output "set print repeats unlimited" "repeats first"
++
+ gdb_test {print argv[0]} "/$filelink\"" $test
+
+ # For a link named /PATH/TO/DIR/LINK, we want to check the output
+@@ -67,6 +71,10 @@ if ![runto_main] {
+ return -1
+ }
+
++# Very long directory paths could be cut below.
++gdb_test_no_output "set print elements unlimited" "elements second"
++gdb_test_no_output "set print repeats unlimited" "repeats second"
++
+ # gdbserver does not have this issue.
+ if ![is_remote target] {
+ setup_kfail "*-*-*" gdb/15934
+
+--VbJkn9YxBvnuCH5J--
+
diff --git a/gdb.spec b/gdb.spec
index 1067ac8..cac3ebb 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -38,7 +38,7 @@ Version: 7.6.50.%{snap}
# The release always contains a leading reserved number, start it at 1.
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 18%{?dist}
+Release: 19%{?dist}
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain
Group: Development/Debuggers
@@ -1346,6 +1346,9 @@ fi
%endif # 0%{!?el5:1} || "%{_target_cpu}" == "noarch"
%changelog
+* Sun Jan 19 2014 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.6.50.20140119-19.fc20
+- Backport several gdb-7.6.x stable branch fixes (BZ 1055155).
+
* Wed Dec 25 2013 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.6.50.20130731-18.fc20
- [aarch64] Backport two breakpoint/watchpoint fixes.
More information about the scm-commits
mailing list