2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/corelow.c
|
2009-05-04 16:53:01 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/corelow.c 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/corelow.c 2017-04-20 23:00:43.358629183 +0200
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
@@ -45,6 +45,10 @@
|
2013-01-11 14:55:20 +00:00
|
|
|
#include "gdb_bfd.h"
|
2013-09-11 13:42:29 +00:00
|
|
|
#include "completer.h"
|
|
|
|
#include "filestuff.h"
|
2009-05-04 16:53:01 +00:00
|
|
|
+#include "auxv.h"
|
|
|
|
+#include "elf/common.h"
|
|
|
|
+#include "gdbcmd.h"
|
2014-02-10 17:10:42 +00:00
|
|
|
+#include "build-id.h"
|
2009-05-04 16:53:01 +00:00
|
|
|
|
|
|
|
#ifndef O_LARGEFILE
|
2012-06-16 04:55:29 +00:00
|
|
|
#define O_LARGEFILE 0
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -266,6 +270,54 @@
|
2011-03-10 09:18:25 +00:00
|
|
|
inferior_ptid = ptid; /* Yes, make it current. */
|
2009-05-04 16:53:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
+static int build_id_core_loads = 1;
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+build_id_locate_exec (int from_tty)
|
|
|
|
+{
|
|
|
|
+ CORE_ADDR at_entry;
|
2016-01-14 17:05:52 +00:00
|
|
|
+ struct bfd_build_id *build_id;
|
2014-02-10 17:10:42 +00:00
|
|
|
+ char *execfilename, *debug_filename;
|
2009-05-04 16:53:01 +00:00
|
|
|
+ char *build_id_filename;
|
2009-07-29 15:48:42 +00:00
|
|
|
+ struct cleanup *back_to;
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
2009-10-12 14:27:52 +00:00
|
|
|
+ if (exec_bfd != NULL || symfile_objfile != NULL)
|
2009-05-04 16:53:01 +00:00
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (target_auxv_search (¤t_target, AT_ENTRY, &at_entry) <= 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ build_id = build_id_addr_get (at_entry);
|
|
|
|
+ if (build_id == NULL)
|
|
|
|
+ return;
|
2013-09-11 13:42:29 +00:00
|
|
|
+ back_to = make_cleanup (xfree, build_id);
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
2009-07-29 15:48:42 +00:00
|
|
|
+ /* SYMFILE_OBJFILE should refer to the main executable (not only to its
|
|
|
|
+ separate debug info file). gcc44+ keeps .eh_frame only in the main
|
|
|
|
+ executable without its duplicate .debug_frame in the separate debug info
|
|
|
|
+ file - such .eh_frame would not be found if SYMFILE_OBJFILE would refer
|
|
|
|
+ directly to the separate debug info file. */
|
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
+ execfilename = build_id_to_filename (build_id, &build_id_filename);
|
2013-09-11 13:42:29 +00:00
|
|
|
+ make_cleanup (xfree, build_id_filename);
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
+ if (execfilename != NULL)
|
2009-05-04 16:53:01 +00:00
|
|
|
+ {
|
2014-02-10 17:10:42 +00:00
|
|
|
+ make_cleanup (xfree, execfilename);
|
|
|
|
+ exec_file_attach (execfilename, from_tty);
|
2017-05-01 01:04:39 +00:00
|
|
|
+ symbol_file_add_main (execfilename,
|
|
|
|
+ symfile_add_flag (!from_tty ? 0 : SYMFILE_VERBOSE));
|
2009-10-12 14:27:52 +00:00
|
|
|
+ if (symfile_objfile != NULL)
|
|
|
|
+ symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED;
|
2009-05-04 16:53:01 +00:00
|
|
|
+ }
|
|
|
|
+ else
|
2009-07-29 15:48:42 +00:00
|
|
|
+ debug_print_missing (_("the main executable file"), build_id_filename);
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
2009-07-29 15:48:42 +00:00
|
|
|
+ do_cleanups (back_to);
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
|
|
|
+ /* No automatic SOLIB_ADD as the libraries would get read twice. */
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
/* This routine opens and sets up the core file bfd. */
|
|
|
|
|
|
|
|
static void
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -402,6 +454,14 @@
|
2013-01-11 14:55:20 +00:00
|
|
|
switch_to_thread (thread->ptid);
|
|
|
|
}
|
2009-05-04 16:53:01 +00:00
|
|
|
|
|
|
|
+ /* Find the build_id identifiers. If it gets executed after
|
|
|
|
+ POST_CREATE_INFERIOR we would clash with asking to discard the already
|
2013-01-11 14:55:20 +00:00
|
|
|
+ loaded VDSO symbols. If it gets executed before bfd_map_over_sections
|
|
|
|
+ INFERIOR_PTID is still not set and libthread_db initialization crashes on
|
|
|
|
+ PID == 0 in ps_pglobal_lookup. */
|
2009-05-04 16:53:01 +00:00
|
|
|
+ if (build_id_core_loads != 0)
|
|
|
|
+ build_id_locate_exec (from_tty);
|
|
|
|
+
|
2013-01-11 14:55:20 +00:00
|
|
|
post_create_inferior (&core_ops, from_tty);
|
|
|
|
|
|
|
|
/* Now go through the target stack looking for threads since there
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -1079,4 +1139,11 @@
|
2009-05-04 16:53:01 +00:00
|
|
|
init_core_ops ();
|
|
|
|
|
2013-09-11 13:42:29 +00:00
|
|
|
add_target_with_completer (&core_ops, filename_completer);
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
|
|
|
+ add_setshow_boolean_cmd ("build-id-core-loads", class_files,
|
|
|
|
+ &build_id_core_loads, _("\
|
|
|
|
+Set whether CORE-FILE loads the build-id associated files automatically."), _("\
|
2013-01-11 14:55:20 +00:00
|
|
|
+Show whether CORE-FILE loads the build-id associated files automatically."),
|
2009-05-04 16:53:01 +00:00
|
|
|
+ NULL, NULL, NULL,
|
|
|
|
+ &setlist, &showlist);
|
|
|
|
}
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/doc/gdb.texinfo
|
2009-05-04 16:53:01 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/doc/gdb.texinfo 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/doc/gdb.texinfo 2017-04-20 23:00:43.366629228 +0200
|
|
|
|
@@ -18987,6 +18987,27 @@
|
2009-05-04 16:53:01 +00:00
|
|
|
|
|
|
|
@end table
|
|
|
|
|
|
|
|
+You can also adjust the current verbosity of the @dfn{build id} locating.
|
|
|
|
+
|
|
|
|
+@table @code
|
|
|
|
+
|
|
|
|
+@kindex set build-id-verbose
|
|
|
|
+@item set build-id-verbose 0
|
|
|
|
+No additional messages are printed.
|
|
|
|
+
|
|
|
|
+@item set build-id-verbose 1
|
|
|
|
+Missing separate debug filenames are printed.
|
|
|
|
+
|
|
|
|
+@item set build-id-verbose 2
|
|
|
|
+Missing separate debug filenames are printed and also all the parsing of the
|
|
|
|
+binaries to find their @dfn{build id} content is printed.
|
|
|
|
+
|
|
|
|
+@kindex show build-id-verbose
|
|
|
|
+@item show build-id-verbose
|
|
|
|
+Show the current verbosity value for the @dfn{build id} content locating.
|
|
|
|
+
|
|
|
|
+@end table
|
|
|
|
+
|
|
|
|
@cindex @code{.gnu_debuglink} sections
|
|
|
|
@cindex debug link sections
|
|
|
|
A debug link is a special section of the executable file named
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/solib-svr4.c
|
2009-05-04 16:53:01 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/solib-svr4.c 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/solib-svr4.c 2017-04-20 23:00:43.367629234 +0200
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
@@ -45,6 +45,7 @@
|
|
|
|
#include "auxv.h"
|
2014-02-10 17:10:42 +00:00
|
|
|
#include "gdb_bfd.h"
|
|
|
|
#include "probe.h"
|
|
|
|
+#include "build-id.h"
|
|
|
|
|
|
|
|
static struct link_map_offsets *svr4_fetch_link_map_offsets (void);
|
|
|
|
static int svr4_have_link_map_offsets (void);
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -1420,9 +1421,52 @@
|
2012-06-16 04:55:29 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2016-01-14 17:05:52 +00:00
|
|
|
- strncpy (newobj->so_name, buffer, SO_NAME_MAX_PATH_SIZE - 1);
|
|
|
|
- newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
|
|
|
|
- strcpy (newobj->so_original_name, newobj->so_name);
|
2012-06-16 04:55:29 +00:00
|
|
|
+ {
|
2016-01-14 17:05:52 +00:00
|
|
|
+ struct bfd_build_id *build_id;
|
2012-06-16 04:55:29 +00:00
|
|
|
+
|
2016-01-14 17:05:52 +00:00
|
|
|
+ strncpy (newobj->so_original_name, buffer, SO_NAME_MAX_PATH_SIZE - 1);
|
|
|
|
+ newobj->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
|
2012-06-16 04:55:29 +00:00
|
|
|
+ /* May get overwritten below. */
|
2016-01-14 17:05:52 +00:00
|
|
|
+ strcpy (newobj->so_name, newobj->so_original_name);
|
2012-06-16 04:55:29 +00:00
|
|
|
+
|
2016-01-14 17:05:52 +00:00
|
|
|
+ build_id = build_id_addr_get (newobj->lm_info->l_ld);
|
2012-06-16 04:55:29 +00:00
|
|
|
+ if (build_id != NULL)
|
|
|
|
+ {
|
|
|
|
+ char *name, *build_id_filename;
|
|
|
|
+
|
|
|
|
+ /* Missing the build-id matching separate debug info file
|
|
|
|
+ would be handled while SO_NAME gets loaded. */
|
2014-02-10 17:10:42 +00:00
|
|
|
+ name = build_id_to_filename (build_id, &build_id_filename);
|
2012-06-16 04:55:29 +00:00
|
|
|
+ if (name != NULL)
|
|
|
|
+ {
|
2016-01-14 17:05:52 +00:00
|
|
|
+ strncpy (newobj->so_name, name, SO_NAME_MAX_PATH_SIZE - 1);
|
|
|
|
+ newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
|
2012-06-16 04:55:29 +00:00
|
|
|
+ xfree (name);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
2016-01-14 17:05:52 +00:00
|
|
|
+ debug_print_missing (newobj->so_name, build_id_filename);
|
2012-06-16 04:55:29 +00:00
|
|
|
+
|
|
|
|
+ /* In the case the main executable was found according to
|
|
|
|
+ its build-id (from a core file) prevent loading
|
|
|
|
+ a different build of a library with accidentally the
|
|
|
|
+ same SO_NAME.
|
|
|
|
+
|
|
|
|
+ It suppresses bogus backtraces (and prints "??" there
|
|
|
|
+ instead) if the on-disk files no longer match the
|
|
|
|
+ running program version. */
|
|
|
|
+
|
|
|
|
+ if (symfile_objfile != NULL
|
|
|
|
+ && (symfile_objfile->flags
|
|
|
|
+ & OBJF_BUILD_ID_CORE_LOADED) != 0)
|
2016-01-14 17:05:52 +00:00
|
|
|
+ newobj->so_name[0] = 0;
|
2012-06-16 04:55:29 +00:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ xfree (build_id_filename);
|
|
|
|
+ xfree (build_id);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
xfree (buffer);
|
2009-05-04 16:53:01 +00:00
|
|
|
|
2012-06-16 04:55:29 +00:00
|
|
|
/* If this entry has no name, or its name matches the name
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/elfread.c
|
2009-05-04 16:53:01 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/elfread.c 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/elfread.c 2017-04-20 23:00:43.367629234 +0200
|
|
|
|
@@ -1265,8 +1265,9 @@
|
2014-02-10 17:10:42 +00:00
|
|
|
&& objfile->separate_debug_objfile == NULL
|
|
|
|
&& objfile->separate_debug_objfile_backlink == NULL)
|
|
|
|
{
|
2017-05-01 01:04:39 +00:00
|
|
|
+ gdb::unique_xmalloc_ptr<char> build_id_filename;
|
|
|
|
gdb::unique_xmalloc_ptr<char> debugfile
|
|
|
|
- (find_separate_debug_file_by_buildid (objfile));
|
|
|
|
+ (find_separate_debug_file_by_buildid (objfile, &build_id_filename));
|
2014-02-10 17:10:42 +00:00
|
|
|
|
|
|
|
if (debugfile == NULL)
|
2017-05-01 01:04:39 +00:00
|
|
|
debugfile.reset (find_separate_debug_file_by_debuglink (objfile));
|
|
|
|
@@ -1278,6 +1279,10 @@
|
|
|
|
symbol_file_add_separate (abfd.get (), debugfile.get (),
|
|
|
|
symfile_flags, objfile);
|
2014-02-10 17:10:42 +00:00
|
|
|
}
|
|
|
|
+ /* Check if any separate debug info has been extracted out. */
|
|
|
|
+ else if (bfd_get_section_by_name (objfile->obfd, ".gnu_debuglink")
|
|
|
|
+ != NULL)
|
2017-05-01 01:04:39 +00:00
|
|
|
+ debug_print_missing (objfile_name (objfile), build_id_filename.get ());
|
2014-02-10 17:10:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/symfile.h
|
2014-02-10 17:10:42 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/symfile.h 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/symfile.h 2017-04-20 23:00:43.368629240 +0200
|
|
|
|
@@ -567,6 +567,10 @@
|
2014-08-11 14:08:48 +00:00
|
|
|
void map_symbol_filenames (symbol_filename_ftype *fun, void *data,
|
|
|
|
int need_fullname);
|
2014-02-10 17:10:42 +00:00
|
|
|
|
|
|
|
+/* build-id support. */
|
2016-01-14 17:05:52 +00:00
|
|
|
+extern struct bfd_build_id *build_id_addr_get (CORE_ADDR addr);
|
2014-02-10 17:10:42 +00:00
|
|
|
+extern void debug_print_missing (const char *binary, const char *debug);
|
|
|
|
+
|
|
|
|
/* From dwarf2read.c */
|
|
|
|
|
|
|
|
/* Names for a dwarf2 debugging section. The field NORMAL is the normal
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/testsuite/lib/gdb.exp
|
2014-02-10 17:10:42 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/testsuite/lib/gdb.exp 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/testsuite/lib/gdb.exp 2017-04-20 23:00:43.369629245 +0200
|
|
|
|
@@ -1646,6 +1646,16 @@
|
2014-02-10 17:10:42 +00:00
|
|
|
warning "Couldn't set the width to 0."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+ # Turn off the missing warnings as the testsuite does not expect it.
|
|
|
|
+ send_gdb "set build-id-verbose 0\n"
|
|
|
|
+ gdb_expect 10 {
|
|
|
|
+ -re "$gdb_prompt $" {
|
|
|
|
+ verbose "Disabled the missing debug infos warnings." 2
|
|
|
|
+ }
|
|
|
|
+ timeout {
|
|
|
|
+ warning "Could not disable the missing debug infos warnings.."
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/testsuite/lib/mi-support.exp
|
2014-02-10 17:10:42 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/testsuite/lib/mi-support.exp 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/testsuite/lib/mi-support.exp 2017-04-20 23:00:43.369629245 +0200
|
|
|
|
@@ -309,6 +309,16 @@
|
2014-02-10 17:10:42 +00:00
|
|
|
warning "Couldn't set the width to 0."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+ # Turn off the missing warnings as the testsuite does not expect it.
|
|
|
|
+ send_gdb "190-gdb-set build-id-verbose 0\n"
|
|
|
|
+ gdb_expect 10 {
|
|
|
|
+ -re ".*190-gdb-set build-id-verbose 0\r\n190\\\^done\r\n$mi_gdb_prompt$" {
|
|
|
|
+ verbose "Disabled the missing debug infos warnings." 2
|
|
|
|
+ }
|
|
|
|
+ timeout {
|
|
|
|
+ warning "Could not disable the missing debug infos warnings.."
|
|
|
|
+ }
|
|
|
|
+ }
|
2016-02-29 19:38:18 +00:00
|
|
|
|
2014-02-10 17:10:42 +00:00
|
|
|
if { $separate_inferior_pty } {
|
2017-02-15 16:05:56 +00:00
|
|
|
mi_create_inferior_pty
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/testsuite/gdb.base/new-ui-pending-input.exp
|
|
|
|
===================================================================
|
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/testsuite/gdb.base/new-ui-pending-input.exp 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/testsuite/gdb.base/new-ui-pending-input.exp 2017-04-20 23:00:43.369629245 +0200
|
|
|
|
@@ -62,6 +62,7 @@
|
2017-02-15 16:05:56 +00:00
|
|
|
set options ""
|
|
|
|
append options " -iex \"set height 0\""
|
|
|
|
append options " -iex \"set width 0\""
|
|
|
|
+ append options " -iex \"set build-id-verbose 0\""
|
|
|
|
append options " -iex \"new-ui console $extra_tty_name\""
|
|
|
|
append options " -ex \"b $bpline\""
|
|
|
|
append options " -ex \"run\""
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/objfiles.h
|
2014-02-10 17:10:42 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/objfiles.h 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/objfiles.h 2017-04-20 23:00:43.370629251 +0200
|
|
|
|
@@ -444,6 +444,10 @@
|
|
|
|
htab_t static_links;
|
|
|
|
};
|
2014-02-10 17:10:42 +00:00
|
|
|
|
|
|
|
+/* This file was loaded according to the BUILD_ID_CORE_LOADS rules. */
|
|
|
|
+
|
2017-05-01 01:04:39 +00:00
|
|
|
+#define OBJF_BUILD_ID_CORE_LOADED static_cast<enum objfile_flag>(1 << 12)
|
2014-02-10 17:10:42 +00:00
|
|
|
+
|
|
|
|
/* Declarations for functions defined in objfiles.c */
|
|
|
|
|
2017-05-01 01:04:39 +00:00
|
|
|
extern struct objfile *allocate_objfile (bfd *, const char *name,
|
|
|
|
Index: gdb-7.99.90.20170420/gdb/testsuite/gdb.base/corefile.exp
|
2014-02-10 17:10:42 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/testsuite/gdb.base/corefile.exp 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/testsuite/gdb.base/corefile.exp 2017-04-20 23:00:43.370629251 +0200
|
2016-02-29 19:38:18 +00:00
|
|
|
@@ -293,3 +293,33 @@
|
2014-02-10 17:10:42 +00:00
|
|
|
pass $test
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+# Test auto-loading of binary files through build-id from the core file.
|
|
|
|
+set buildid [build_id_debug_filename_get $binfile]
|
|
|
|
+set wholetest "binfile found by build-id"
|
|
|
|
+if {$buildid == ""} {
|
|
|
|
+ untested "$wholetest (binary has no build-id)"
|
|
|
|
+} else {
|
|
|
|
+ gdb_exit
|
|
|
|
+ gdb_start
|
|
|
|
+
|
|
|
|
+ regsub {\.debug$} $buildid {} buildid
|
2016-02-29 19:38:18 +00:00
|
|
|
+ set debugdir [standard_output_file ${testfile}-debugdir]
|
2014-02-10 17:10:42 +00:00
|
|
|
+ file delete -force -- $debugdir
|
|
|
|
+ file mkdir $debugdir/[file dirname $buildid]
|
|
|
|
+ file copy $binfile $debugdir/$buildid
|
|
|
|
+
|
|
|
|
+ set test "show debug-file-directory"
|
|
|
|
+ gdb_test_multiple $test $test {
|
|
|
|
+ -re "The directory where separate debug symbols are searched for is \"(.*)\"\\.\r\n$gdb_prompt $" {
|
|
|
|
+ set debugdir_orig $expect_out(1,string)
|
|
|
|
+ pass $test
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ gdb_test_no_output "set debug-file-directory $debugdir:$debugdir_orig" "set debug-file-directory"
|
|
|
|
+ gdb_test "show build-id-core-loads" {Whether CORE-FILE loads the build-id associated files automatically is on\.}
|
|
|
|
+ gdb_test "core-file $corefile" "\r\nProgram terminated with .*" "core-file without executable"
|
|
|
|
+ gdb_test "info files" "Local exec file:\r\n\[ \t\]*`[string_to_regexp $debugdir/$buildid]', file type .*"
|
|
|
|
+ pass $wholetest
|
|
|
|
+}
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/build-id.c
|
2014-02-10 17:10:42 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/build-id.c 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/build-id.c 2017-04-20 23:03:00.060399474 +0200
|
2016-01-14 17:05:52 +00:00
|
|
|
@@ -26,11 +26,67 @@
|
2014-02-10 17:10:42 +00:00
|
|
|
#include "objfiles.h"
|
|
|
|
#include "filenames.h"
|
2016-01-14 17:05:52 +00:00
|
|
|
#include "gdbcore.h"
|
2009-05-04 16:53:01 +00:00
|
|
|
+#include "libbfd.h"
|
2010-04-16 16:29:50 +00:00
|
|
|
+#include "gdbcore.h"
|
|
|
|
+#include "gdbcmd.h"
|
|
|
|
+#include "observer.h"
|
2016-01-14 17:05:52 +00:00
|
|
|
+#include "elf/external.h"
|
|
|
|
+#include "elf/internal.h"
|
|
|
|
+#include "elf/common.h"
|
|
|
|
+#include "elf-bfd.h"
|
2011-08-11 13:47:36 +00:00
|
|
|
+#include <sys/stat.h>
|
2014-02-10 17:10:42 +00:00
|
|
|
+
|
2009-05-04 16:53:01 +00:00
|
|
|
+#define BUILD_ID_VERBOSE_NONE 0
|
|
|
|
+#define BUILD_ID_VERBOSE_FILENAMES 1
|
|
|
|
+#define BUILD_ID_VERBOSE_BINARY_PARSE 2
|
|
|
|
+static int build_id_verbose = BUILD_ID_VERBOSE_FILENAMES;
|
|
|
|
+static void
|
|
|
|
+show_build_id_verbose (struct ui_file *file, int from_tty,
|
|
|
|
+ struct cmd_list_element *c, const char *value)
|
|
|
|
+{
|
|
|
|
+ fprintf_filtered (file, _("Verbosity level of the build-id locator is %s.\n"),
|
|
|
|
+ value);
|
|
|
|
+}
|
2011-08-11 13:47:36 +00:00
|
|
|
+/* Locate NT_GNU_BUILD_ID and return its matching debug filename.
|
|
|
|
+ FIXME: NOTE decoding should be unified with the BFD core notes decoding. */
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
+
|
2016-01-14 17:05:52 +00:00
|
|
|
+static struct bfd_build_id *
|
2009-05-04 16:53:01 +00:00
|
|
|
+build_id_buf_get (bfd *templ, gdb_byte *buf, bfd_size_type size)
|
|
|
|
+{
|
|
|
|
+ bfd_byte *p;
|
|
|
|
+
|
|
|
|
+ p = buf;
|
|
|
|
+ while (p < buf + size)
|
|
|
|
+ {
|
|
|
|
+ /* FIXME: bad alignment assumption. */
|
|
|
|
+ Elf_External_Note *xnp = (Elf_External_Note *) p;
|
|
|
|
+ size_t namesz = H_GET_32 (templ, xnp->namesz);
|
|
|
|
+ size_t descsz = H_GET_32 (templ, xnp->descsz);
|
2013-09-11 13:42:29 +00:00
|
|
|
+ bfd_byte *descdata = (gdb_byte *) xnp->name + BFD_ALIGN (namesz, 4);
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
|
|
|
+ if (H_GET_32 (templ, xnp->type) == NT_GNU_BUILD_ID
|
|
|
|
+ && namesz == sizeof "GNU"
|
|
|
|
+ && memcmp (xnp->name, "GNU", sizeof "GNU") == 0)
|
|
|
|
+ {
|
|
|
|
+ size_t size = descsz;
|
2017-02-15 16:05:56 +00:00
|
|
|
+ gdb_byte *data = (gdb_byte *) descdata;
|
2016-01-14 17:05:52 +00:00
|
|
|
+ struct bfd_build_id *retval;
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
2017-02-15 16:05:56 +00:00
|
|
|
+ retval = (struct bfd_build_id *) xmalloc (sizeof *retval - 1 + size);
|
2009-05-04 16:53:01 +00:00
|
|
|
+ retval->size = size;
|
|
|
|
+ memcpy (retval->data, data, size);
|
2016-01-14 17:05:52 +00:00
|
|
|
+
|
2009-05-04 16:53:01 +00:00
|
|
|
+ return retval;
|
|
|
|
+ }
|
|
|
|
+ p = descdata + BFD_ALIGN (descsz, 4);
|
|
|
|
+ }
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
2016-01-14 17:05:52 +00:00
|
|
|
|
|
|
|
/* See build-id.h. */
|
|
|
|
|
|
|
|
const struct bfd_build_id *
|
2013-09-11 13:42:29 +00:00
|
|
|
-build_id_bfd_get (bfd *abfd)
|
2009-05-04 16:53:01 +00:00
|
|
|
+build_id_bfd_shdr_get (bfd *abfd)
|
|
|
|
{
|
2016-01-14 17:05:52 +00:00
|
|
|
if (!bfd_check_format (abfd, bfd_object))
|
|
|
|
return NULL;
|
2016-02-29 19:38:18 +00:00
|
|
|
@@ -42,6 +98,348 @@
|
2016-01-14 17:05:52 +00:00
|
|
|
return NULL;
|
2009-05-04 16:53:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
+/* Core files may have missing (corrupt) SHDR but PDHR is correct there.
|
|
|
|
+ bfd_elf_bfd_from_remote_memory () has too much overhead by
|
|
|
|
+ allocating/reading all the available ELF PT_LOADs. */
|
|
|
|
+
|
2016-01-14 17:05:52 +00:00
|
|
|
+static struct bfd_build_id *
|
2009-05-04 16:53:01 +00:00
|
|
|
+build_id_phdr_get (bfd *templ, bfd_vma loadbase, unsigned e_phnum,
|
|
|
|
+ Elf_Internal_Phdr *i_phdr)
|
|
|
|
+{
|
|
|
|
+ int i;
|
2016-01-14 17:05:52 +00:00
|
|
|
+ struct bfd_build_id *retval = NULL;
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
|
|
|
+ for (i = 0; i < e_phnum; i++)
|
|
|
|
+ if (i_phdr[i].p_type == PT_NOTE && i_phdr[i].p_filesz > 0)
|
|
|
|
+ {
|
|
|
|
+ Elf_Internal_Phdr *hdr = &i_phdr[i];
|
|
|
|
+ gdb_byte *buf;
|
|
|
|
+ int err;
|
|
|
|
+
|
2017-02-15 16:05:56 +00:00
|
|
|
+ buf = (gdb_byte *) xmalloc (hdr->p_filesz);
|
2009-05-04 16:53:01 +00:00
|
|
|
+ err = target_read_memory (loadbase + i_phdr[i].p_vaddr, buf,
|
|
|
|
+ hdr->p_filesz);
|
|
|
|
+ if (err == 0)
|
|
|
|
+ retval = build_id_buf_get (templ, buf, hdr->p_filesz);
|
|
|
|
+ else
|
|
|
|
+ retval = NULL;
|
|
|
|
+ xfree (buf);
|
|
|
|
+ if (retval != NULL)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ return retval;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* First we validate the file by reading in the ELF header and checking
|
|
|
|
+ the magic number. */
|
|
|
|
+
|
|
|
|
+static inline bfd_boolean
|
|
|
|
+elf_file_p (Elf64_External_Ehdr *x_ehdrp64)
|
|
|
|
+{
|
|
|
|
+ gdb_assert (sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr));
|
|
|
|
+ gdb_assert (offsetof (Elf64_External_Ehdr, e_ident)
|
|
|
|
+ == offsetof (Elf32_External_Ehdr, e_ident));
|
|
|
|
+ gdb_assert (sizeof (((Elf64_External_Ehdr *) 0)->e_ident)
|
|
|
|
+ == sizeof (((Elf32_External_Ehdr *) 0)->e_ident));
|
|
|
|
+
|
|
|
|
+ return ((x_ehdrp64->e_ident[EI_MAG0] == ELFMAG0)
|
|
|
|
+ && (x_ehdrp64->e_ident[EI_MAG1] == ELFMAG1)
|
|
|
|
+ && (x_ehdrp64->e_ident[EI_MAG2] == ELFMAG2)
|
|
|
|
+ && (x_ehdrp64->e_ident[EI_MAG3] == ELFMAG3));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Translate an ELF file header in external format into an ELF file header in
|
|
|
|
+ internal format. */
|
|
|
|
+
|
|
|
|
+#define H_GET_WORD(bfd, ptr) (is64 ? H_GET_64 (bfd, (ptr)) \
|
|
|
|
+ : H_GET_32 (bfd, (ptr)))
|
|
|
|
+#define H_GET_SIGNED_WORD(bfd, ptr) (is64 ? H_GET_S64 (bfd, (ptr)) \
|
|
|
|
+ : H_GET_S32 (bfd, (ptr)))
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+elf_swap_ehdr_in (bfd *abfd,
|
|
|
|
+ const Elf64_External_Ehdr *src64,
|
|
|
|
+ Elf_Internal_Ehdr *dst)
|
|
|
|
+{
|
|
|
|
+ int is64 = bfd_get_arch_size (abfd) == 64;
|
|
|
|
+#define SRC(field) (is64 ? src64->field \
|
|
|
|
+ : ((const Elf32_External_Ehdr *) src64)->field)
|
|
|
|
+
|
|
|
|
+ int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
|
|
|
|
+ memcpy (dst->e_ident, SRC (e_ident), EI_NIDENT);
|
|
|
|
+ dst->e_type = H_GET_16 (abfd, SRC (e_type));
|
|
|
|
+ dst->e_machine = H_GET_16 (abfd, SRC (e_machine));
|
|
|
|
+ dst->e_version = H_GET_32 (abfd, SRC (e_version));
|
|
|
|
+ if (signed_vma)
|
|
|
|
+ dst->e_entry = H_GET_SIGNED_WORD (abfd, SRC (e_entry));
|
|
|
|
+ else
|
|
|
|
+ dst->e_entry = H_GET_WORD (abfd, SRC (e_entry));
|
|
|
|
+ dst->e_phoff = H_GET_WORD (abfd, SRC (e_phoff));
|
|
|
|
+ dst->e_shoff = H_GET_WORD (abfd, SRC (e_shoff));
|
|
|
|
+ dst->e_flags = H_GET_32 (abfd, SRC (e_flags));
|
|
|
|
+ dst->e_ehsize = H_GET_16 (abfd, SRC (e_ehsize));
|
|
|
|
+ dst->e_phentsize = H_GET_16 (abfd, SRC (e_phentsize));
|
|
|
|
+ dst->e_phnum = H_GET_16 (abfd, SRC (e_phnum));
|
|
|
|
+ dst->e_shentsize = H_GET_16 (abfd, SRC (e_shentsize));
|
|
|
|
+ dst->e_shnum = H_GET_16 (abfd, SRC (e_shnum));
|
|
|
|
+ dst->e_shstrndx = H_GET_16 (abfd, SRC (e_shstrndx));
|
|
|
|
+
|
|
|
|
+#undef SRC
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Translate an ELF program header table entry in external format into an
|
|
|
|
+ ELF program header table entry in internal format. */
|
|
|
|
+
|
2012-06-16 04:55:29 +00:00
|
|
|
+static void
|
2009-05-04 16:53:01 +00:00
|
|
|
+elf_swap_phdr_in (bfd *abfd,
|
|
|
|
+ const Elf64_External_Phdr *src64,
|
|
|
|
+ Elf_Internal_Phdr *dst)
|
|
|
|
+{
|
|
|
|
+ int is64 = bfd_get_arch_size (abfd) == 64;
|
|
|
|
+#define SRC(field) (is64 ? src64->field \
|
|
|
|
+ : ((const Elf32_External_Phdr *) src64)->field)
|
|
|
|
+
|
|
|
|
+ int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
|
|
|
|
+
|
|
|
|
+ dst->p_type = H_GET_32 (abfd, SRC (p_type));
|
|
|
|
+ dst->p_flags = H_GET_32 (abfd, SRC (p_flags));
|
|
|
|
+ dst->p_offset = H_GET_WORD (abfd, SRC (p_offset));
|
|
|
|
+ if (signed_vma)
|
|
|
|
+ {
|
|
|
|
+ dst->p_vaddr = H_GET_SIGNED_WORD (abfd, SRC (p_vaddr));
|
|
|
|
+ dst->p_paddr = H_GET_SIGNED_WORD (abfd, SRC (p_paddr));
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dst->p_vaddr = H_GET_WORD (abfd, SRC (p_vaddr));
|
|
|
|
+ dst->p_paddr = H_GET_WORD (abfd, SRC (p_paddr));
|
|
|
|
+ }
|
|
|
|
+ dst->p_filesz = H_GET_WORD (abfd, SRC (p_filesz));
|
|
|
|
+ dst->p_memsz = H_GET_WORD (abfd, SRC (p_memsz));
|
|
|
|
+ dst->p_align = H_GET_WORD (abfd, SRC (p_align));
|
|
|
|
+
|
|
|
|
+#undef SRC
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#undef H_GET_SIGNED_WORD
|
|
|
|
+#undef H_GET_WORD
|
|
|
|
+
|
|
|
|
+static Elf_Internal_Phdr *
|
|
|
|
+elf_get_phdr (bfd *templ, bfd_vma ehdr_vma, unsigned *e_phnum_pointer,
|
|
|
|
+ bfd_vma *loadbase_pointer)
|
|
|
|
+{
|
|
|
|
+ /* sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr) */
|
|
|
|
+ Elf64_External_Ehdr x_ehdr64; /* Elf file header, external form */
|
|
|
|
+ Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
|
|
|
|
+ bfd_size_type x_phdrs_size;
|
|
|
|
+ gdb_byte *x_phdrs_ptr;
|
|
|
|
+ Elf_Internal_Phdr *i_phdrs;
|
|
|
|
+ int err;
|
|
|
|
+ unsigned int i;
|
|
|
|
+ bfd_vma loadbase;
|
|
|
|
+ int loadbase_set;
|
|
|
|
+
|
|
|
|
+ gdb_assert (templ != NULL);
|
|
|
|
+ gdb_assert (sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr));
|
|
|
|
+
|
|
|
|
+ /* Read in the ELF header in external format. */
|
|
|
|
+ err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr64, sizeof x_ehdr64);
|
|
|
|
+ if (err)
|
|
|
|
+ {
|
|
|
|
+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE)
|
|
|
|
+ warning (_("build-id: Error reading ELF header at address 0x%lx"),
|
|
|
|
+ (unsigned long) ehdr_vma);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Now check to see if we have a valid ELF file, and one that BFD can
|
|
|
|
+ make use of. The magic number must match, the address size ('class')
|
|
|
|
+ and byte-swapping must match our XVEC entry. */
|
|
|
|
+
|
|
|
|
+ if (! elf_file_p (&x_ehdr64)
|
|
|
|
+ || x_ehdr64.e_ident[EI_VERSION] != EV_CURRENT
|
|
|
|
+ || !((bfd_get_arch_size (templ) == 64
|
|
|
|
+ && x_ehdr64.e_ident[EI_CLASS] == ELFCLASS64)
|
|
|
|
+ || (bfd_get_arch_size (templ) == 32
|
|
|
|
+ && x_ehdr64.e_ident[EI_CLASS] == ELFCLASS32)))
|
|
|
|
+ {
|
|
|
|
+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE)
|
|
|
|
+ warning (_("build-id: Unrecognized ELF header at address 0x%lx"),
|
|
|
|
+ (unsigned long) ehdr_vma);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Check that file's byte order matches xvec's */
|
|
|
|
+ switch (x_ehdr64.e_ident[EI_DATA])
|
|
|
|
+ {
|
|
|
|
+ case ELFDATA2MSB: /* Big-endian */
|
|
|
|
+ if (! bfd_header_big_endian (templ))
|
|
|
|
+ {
|
|
|
|
+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE)
|
|
|
|
+ warning (_("build-id: Unrecognized "
|
|
|
|
+ "big-endian ELF header at address 0x%lx"),
|
|
|
|
+ (unsigned long) ehdr_vma);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case ELFDATA2LSB: /* Little-endian */
|
|
|
|
+ if (! bfd_header_little_endian (templ))
|
|
|
|
+ {
|
|
|
|
+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE)
|
|
|
|
+ warning (_("build-id: Unrecognized "
|
|
|
|
+ "little-endian ELF header at address 0x%lx"),
|
|
|
|
+ (unsigned long) ehdr_vma);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case ELFDATANONE: /* No data encoding specified */
|
|
|
|
+ default: /* Unknown data encoding specified */
|
|
|
|
+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE)
|
|
|
|
+ warning (_("build-id: Unrecognized "
|
|
|
|
+ "ELF header endianity at address 0x%lx"),
|
|
|
|
+ (unsigned long) ehdr_vma);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ elf_swap_ehdr_in (templ, &x_ehdr64, &i_ehdr);
|
|
|
|
+
|
|
|
|
+ /* The file header tells where to find the program headers.
|
|
|
|
+ These are what we use to actually choose what to read. */
|
|
|
|
+
|
|
|
|
+ if (i_ehdr.e_phentsize != (bfd_get_arch_size (templ) == 64
|
|
|
|
+ ? sizeof (Elf64_External_Phdr)
|
|
|
|
+ : sizeof (Elf32_External_Phdr))
|
|
|
|
+ || i_ehdr.e_phnum == 0)
|
|
|
|
+ {
|
|
|
|
+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE)
|
|
|
|
+ warning (_("build-id: Invalid ELF program headers from the ELF header "
|
|
|
|
+ "at address 0x%lx"), (unsigned long) ehdr_vma);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ x_phdrs_size = (bfd_get_arch_size (templ) == 64 ? sizeof (Elf64_External_Phdr)
|
|
|
|
+ : sizeof (Elf32_External_Phdr));
|
|
|
|
+
|
2017-02-15 16:05:56 +00:00
|
|
|
+ i_phdrs = (Elf_Internal_Phdr *) xmalloc (i_ehdr.e_phnum * (sizeof *i_phdrs + x_phdrs_size));
|
|
|
|
+ x_phdrs_ptr = (gdb_byte *) &i_phdrs[i_ehdr.e_phnum];
|
2009-05-04 16:53:01 +00:00
|
|
|
+ err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs_ptr,
|
|
|
|
+ i_ehdr.e_phnum * x_phdrs_size);
|
|
|
|
+ if (err)
|
|
|
|
+ {
|
|
|
|
+ free (i_phdrs);
|
|
|
|
+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE)
|
|
|
|
+ warning (_("build-id: Error reading "
|
|
|
|
+ "ELF program headers at address 0x%lx"),
|
|
|
|
+ (unsigned long) (ehdr_vma + i_ehdr.e_phoff));
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ loadbase = ehdr_vma;
|
|
|
|
+ loadbase_set = 0;
|
|
|
|
+ for (i = 0; i < i_ehdr.e_phnum; ++i)
|
|
|
|
+ {
|
|
|
|
+ elf_swap_phdr_in (templ, (Elf64_External_Phdr *)
|
|
|
|
+ (x_phdrs_ptr + i * x_phdrs_size), &i_phdrs[i]);
|
|
|
|
+ /* IA-64 vDSO may have two mappings for one segment, where one mapping
|
|
|
|
+ is executable only, and one is read only. We must not use the
|
|
|
|
+ executable one (PF_R is the first one, PF_X the second one). */
|
|
|
|
+ if (i_phdrs[i].p_type == PT_LOAD && (i_phdrs[i].p_flags & PF_R))
|
|
|
|
+ {
|
|
|
|
+ /* Only the first PT_LOAD segment indicates the file bias.
|
|
|
|
+ Next segments may have P_VADDR arbitrarily higher.
|
|
|
|
+ If the first segment has P_VADDR zero any next segment must not
|
|
|
|
+ confuse us, the first one sets LOADBASE certainly enough. */
|
|
|
|
+ if (!loadbase_set && i_phdrs[i].p_offset == 0)
|
|
|
|
+ {
|
|
|
|
+ loadbase = ehdr_vma - i_phdrs[i].p_vaddr;
|
|
|
|
+ loadbase_set = 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE)
|
|
|
|
+ warning (_("build-id: Found ELF header at address 0x%lx, loadbase 0x%lx"),
|
|
|
|
+ (unsigned long) ehdr_vma, (unsigned long) loadbase);
|
|
|
|
+
|
|
|
|
+ *e_phnum_pointer = i_ehdr.e_phnum;
|
|
|
|
+ *loadbase_pointer = loadbase;
|
|
|
|
+ return i_phdrs;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* BUILD_ID_ADDR_GET gets ADDR located somewhere in the object.
|
|
|
|
+ Find the first section before ADDR containing an ELF header.
|
|
|
|
+ We rely on the fact the sections from multiple files do not mix.
|
|
|
|
+ FIXME: We should check ADDR is contained _inside_ the section with possibly
|
|
|
|
+ missing content (P_FILESZ < P_MEMSZ). These omitted sections are currently
|
|
|
|
+ hidden by _BFD_ELF_MAKE_SECTION_FROM_PHDR. */
|
|
|
|
+
|
|
|
|
+static CORE_ADDR build_id_addr;
|
|
|
|
+struct build_id_addr_sect
|
|
|
|
+ {
|
|
|
|
+ struct build_id_addr_sect *next;
|
|
|
|
+ asection *sect;
|
|
|
|
+ };
|
|
|
|
+static struct build_id_addr_sect *build_id_addr_sect;
|
|
|
|
+
|
|
|
|
+static void build_id_addr_candidate (bfd *abfd, asection *sect, void *obj)
|
|
|
|
+{
|
|
|
|
+ if (build_id_addr >= bfd_section_vma (abfd, sect))
|
|
|
|
+ {
|
|
|
|
+ struct build_id_addr_sect *candidate;
|
|
|
|
+
|
2017-02-15 16:05:56 +00:00
|
|
|
+ candidate = (struct build_id_addr_sect *) xmalloc (sizeof *candidate);
|
2009-05-04 16:53:01 +00:00
|
|
|
+ candidate->next = build_id_addr_sect;
|
|
|
|
+ build_id_addr_sect = candidate;
|
|
|
|
+ candidate->sect = sect;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
2016-01-14 17:05:52 +00:00
|
|
|
+struct bfd_build_id *
|
2009-05-04 16:53:01 +00:00
|
|
|
+build_id_addr_get (CORE_ADDR addr)
|
|
|
|
+{
|
|
|
|
+ struct build_id_addr_sect *candidate;
|
2016-01-14 17:05:52 +00:00
|
|
|
+ struct bfd_build_id *retval = NULL;
|
2009-05-04 16:53:01 +00:00
|
|
|
+ Elf_Internal_Phdr *i_phdr = NULL;
|
|
|
|
+ bfd_vma loadbase = 0;
|
|
|
|
+ unsigned e_phnum = 0;
|
|
|
|
+
|
|
|
|
+ if (core_bfd == NULL)
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ build_id_addr = addr;
|
|
|
|
+ gdb_assert (build_id_addr_sect == NULL);
|
|
|
|
+ bfd_map_over_sections (core_bfd, build_id_addr_candidate, NULL);
|
|
|
|
+
|
|
|
|
+ /* Sections are sorted in the high-to-low VMAs order.
|
|
|
|
+ Stop the search on the first ELF header we find.
|
|
|
|
+ Do not continue the search even if it does not contain NT_GNU_BUILD_ID. */
|
|
|
|
+
|
|
|
|
+ for (candidate = build_id_addr_sect; candidate != NULL;
|
|
|
|
+ candidate = candidate->next)
|
|
|
|
+ {
|
|
|
|
+ i_phdr = elf_get_phdr (core_bfd,
|
|
|
|
+ bfd_section_vma (core_bfd, candidate->sect),
|
|
|
|
+ &e_phnum, &loadbase);
|
|
|
|
+ if (i_phdr != NULL)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (i_phdr != NULL)
|
|
|
|
+ {
|
|
|
|
+ retval = build_id_phdr_get (core_bfd, loadbase, e_phnum, i_phdr);
|
|
|
|
+ xfree (i_phdr);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ while (build_id_addr_sect != NULL)
|
|
|
|
+ {
|
|
|
|
+ candidate = build_id_addr_sect;
|
|
|
|
+ build_id_addr_sect = candidate->next;
|
|
|
|
+ xfree (candidate);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return retval;
|
|
|
|
+}
|
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
/* See build-id.h. */
|
2009-05-04 16:53:01 +00:00
|
|
|
|
2014-02-10 17:10:42 +00:00
|
|
|
int
|
2016-02-29 19:38:18 +00:00
|
|
|
@@ -50,7 +448,7 @@
|
2016-01-14 17:05:52 +00:00
|
|
|
const struct bfd_build_id *found;
|
2014-02-10 17:10:42 +00:00
|
|
|
int retval = 0;
|
2009-05-04 16:53:01 +00:00
|
|
|
|
|
|
|
- found = build_id_bfd_get (abfd);
|
|
|
|
+ found = build_id_bfd_shdr_get (abfd);
|
|
|
|
|
|
|
|
if (found == NULL)
|
2014-02-10 17:10:42 +00:00
|
|
|
warning (_("File \"%s\" has no build-id, file skipped"),
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -65,23 +463,54 @@
|
2014-02-10 17:10:42 +00:00
|
|
|
return retval;
|
2009-05-04 16:53:01 +00:00
|
|
|
}
|
|
|
|
|
2014-02-10 17:10:42 +00:00
|
|
|
+static char *
|
2013-09-11 13:42:29 +00:00
|
|
|
+link_resolve (const char *symlink, int level)
|
|
|
|
+{
|
|
|
|
+ char buf[PATH_MAX + 1], *target, *retval;
|
|
|
|
+ ssize_t got;
|
|
|
|
+
|
|
|
|
+ if (level > 10)
|
|
|
|
+ return xstrdup (symlink);
|
|
|
|
+
|
|
|
|
+ got = readlink (symlink, buf, sizeof (buf));
|
|
|
|
+ if (got < 0 || got >= sizeof (buf))
|
|
|
|
+ return xstrdup (symlink);
|
|
|
|
+ buf[got] = '\0';
|
|
|
|
+
|
|
|
|
+ if (IS_ABSOLUTE_PATH (buf))
|
|
|
|
+ target = xstrdup (buf);
|
|
|
|
+ else
|
|
|
|
+ {
|
2017-05-01 01:04:39 +00:00
|
|
|
+ const std::string dir (ldirname (symlink));
|
2013-09-11 13:42:29 +00:00
|
|
|
+
|
|
|
|
+ target = xstrprintf ("%s"
|
|
|
|
+#ifndef HAVE_DOS_BASED_FILE_SYSTEM
|
|
|
|
+ "/"
|
|
|
|
+#else /* HAVE_DOS_BASED_FILE_SYSTEM */
|
|
|
|
+ "\\"
|
|
|
|
+#endif /* HAVE_DOS_BASED_FILE_SYSTEM */
|
2017-05-01 01:04:39 +00:00
|
|
|
+ "%s", dir.c_str(), buf);
|
2013-09-11 13:42:29 +00:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ retval = link_resolve (target, level + 1);
|
|
|
|
+ xfree (target);
|
|
|
|
+ return retval;
|
|
|
|
+}
|
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
/* See build-id.h. */
|
|
|
|
|
2017-05-01 01:04:39 +00:00
|
|
|
gdb_bfd_ref_ptr
|
2014-02-10 17:10:42 +00:00
|
|
|
-build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
|
|
|
|
+build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id,
|
|
|
|
+ char **link_return, int add_debug_suffix)
|
2009-05-04 16:53:01 +00:00
|
|
|
{
|
2014-02-10 17:10:42 +00:00
|
|
|
- char *link, *debugdir;
|
|
|
|
+ char *link, *debugdir, *link_all = NULL;
|
2012-06-16 04:55:29 +00:00
|
|
|
VEC (char_ptr) *debugdir_vec;
|
|
|
|
struct cleanup *back_to;
|
|
|
|
int ix;
|
2017-05-01 01:04:39 +00:00
|
|
|
gdb_bfd_ref_ptr abfd;
|
2016-02-29 19:38:18 +00:00
|
|
|
- int alloc_len;
|
2009-05-04 16:53:01 +00:00
|
|
|
|
|
|
|
/* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
|
2016-02-29 19:38:18 +00:00
|
|
|
- alloc_len = (strlen (debug_file_directory)
|
|
|
|
- + (sizeof "/.build-id/" - 1) + 1
|
|
|
|
- + 2 * build_id_len + (sizeof ".debug" - 1) + 1);
|
|
|
|
- link = (char *) alloca (alloc_len);
|
2017-02-15 16:05:56 +00:00
|
|
|
+ link = (char *) xmalloc (strlen (debug_file_directory) + 2 * build_id_len + 50);
|
2009-11-23 12:19:03 +00:00
|
|
|
|
|
|
|
/* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
|
|
|
|
cause "/.build-id/..." lookups. */
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -94,9 +523,12 @@
|
2012-06-16 04:55:29 +00:00
|
|
|
size_t debugdir_len = strlen (debugdir);
|
2014-02-10 17:10:42 +00:00
|
|
|
const gdb_byte *data = build_id;
|
|
|
|
size_t size = build_id_len;
|
2013-09-11 13:42:29 +00:00
|
|
|
- char *s;
|
2014-02-10 17:10:42 +00:00
|
|
|
char *filename = NULL;
|
2016-01-14 17:05:52 +00:00
|
|
|
struct cleanup *inner;
|
2011-08-11 13:47:36 +00:00
|
|
|
+ unsigned seqno;
|
|
|
|
+ struct stat statbuf_trash;
|
2013-09-11 13:42:29 +00:00
|
|
|
+ /* Initialize it just to avoid a GCC false warning. */
|
|
|
|
+ char *s, *link0 = NULL, *link0_resolved;
|
2011-08-11 13:47:36 +00:00
|
|
|
|
2012-06-16 04:55:29 +00:00
|
|
|
memcpy (link, debugdir, debugdir_len);
|
2013-09-11 13:42:29 +00:00
|
|
|
s = &link[debugdir_len];
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -110,45 +542,290 @@
|
2009-11-23 12:19:03 +00:00
|
|
|
*s++ = '/';
|
|
|
|
while (size-- > 0)
|
|
|
|
s += sprintf (s, "%02x", (unsigned) *data++);
|
|
|
|
- strcpy (s, ".debug");
|
2011-08-11 13:47:36 +00:00
|
|
|
+ for (seqno = 0;; seqno++)
|
2012-06-16 04:55:29 +00:00
|
|
|
+ {
|
2011-08-11 13:47:36 +00:00
|
|
|
+ char *s2;
|
2014-02-10 17:10:42 +00:00
|
|
|
|
|
|
|
- /* lrealpath() is expensive even for the usually non-existent files. */
|
|
|
|
- if (access (link, F_OK) == 0)
|
|
|
|
- filename = lrealpath (link);
|
2011-08-11 13:47:36 +00:00
|
|
|
+ if (seqno)
|
|
|
|
+ {
|
|
|
|
+ /* There can be multiple build-id symlinks pointing to real files
|
|
|
|
+ with the same build-id (such as hard links). Some of the real
|
|
|
|
+ files may not be installed. */
|
|
|
|
+
|
|
|
|
+ s2 = s + sprintf (s, ".%u", seqno);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ s2 = s;
|
|
|
|
+
|
|
|
|
+ if (add_debug_suffix)
|
|
|
|
+ strcpy (s2, ".debug");
|
|
|
|
+ else
|
|
|
|
+ *s2 = 0;
|
2013-09-11 13:42:29 +00:00
|
|
|
+
|
|
|
|
+ if (!seqno)
|
|
|
|
+ {
|
|
|
|
+ /* If none of the real files is found report as missing file
|
|
|
|
+ always the non-.%u-suffixed file. */
|
|
|
|
+ link0 = xstrdup (link);
|
|
|
|
+ }
|
|
|
|
+
|
2011-08-11 13:47:36 +00:00
|
|
|
+ /* `access' automatically dereferences LINK. */
|
|
|
|
+ if (lstat (link, &statbuf_trash) != 0)
|
|
|
|
+ {
|
|
|
|
+ /* Stop increasing SEQNO. */
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
+ filename = lrealpath (link);
|
|
|
|
+ if (filename == NULL)
|
|
|
|
+ continue;
|
2011-08-11 13:47:36 +00:00
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
+ /* We expect to be silent on the non-existing files. */
|
2016-01-14 17:05:52 +00:00
|
|
|
+ inner = make_cleanup (xfree, filename);
|
|
|
|
+ abfd = gdb_bfd_open (filename, gnutarget, -1);
|
|
|
|
+ do_cleanups (inner);
|
2017-05-01 01:04:39 +00:00
|
|
|
+
|
|
|
|
+ if (abfd == NULL)
|
|
|
|
+ continue;
|
2014-02-10 17:10:42 +00:00
|
|
|
|
|
|
|
- if (filename == NULL)
|
|
|
|
- continue;
|
2017-05-01 01:04:39 +00:00
|
|
|
+ if (build_id_verify (abfd.get(), build_id_len, build_id))
|
|
|
|
+ break;
|
2016-01-14 17:05:52 +00:00
|
|
|
|
|
|
|
- /* We expect to be silent on the non-existing files. */
|
|
|
|
- inner = make_cleanup (xfree, filename);
|
|
|
|
- abfd = gdb_bfd_open (filename, gnutarget, -1);
|
|
|
|
- do_cleanups (inner);
|
2017-05-01 01:04:39 +00:00
|
|
|
+ abfd.release ();
|
2014-02-10 17:10:42 +00:00
|
|
|
|
|
|
|
- if (abfd == NULL)
|
|
|
|
- continue;
|
|
|
|
+ filename = NULL;
|
2009-11-23 12:19:03 +00:00
|
|
|
+ }
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
|
2017-05-01 01:04:39 +00:00
|
|
|
- if (build_id_verify (abfd.get(), build_id_len, build_id))
|
|
|
|
- break;
|
2014-02-10 17:10:42 +00:00
|
|
|
+ if (filename != NULL)
|
2013-09-11 13:42:29 +00:00
|
|
|
+ {
|
2014-02-10 17:10:42 +00:00
|
|
|
+ /* LINK_ALL is not used below in this non-NULL FILENAME case. */
|
2013-09-11 13:42:29 +00:00
|
|
|
+ xfree (link0);
|
2012-06-16 04:55:29 +00:00
|
|
|
+ break;
|
2013-09-11 13:42:29 +00:00
|
|
|
+ }
|
2017-05-01 01:04:39 +00:00
|
|
|
|
|
|
|
- abfd.release ();
|
2013-09-11 13:42:29 +00:00
|
|
|
+ /* If the symlink has target request to install the target.
|
|
|
|
+ BASE-debuginfo.rpm contains the symlink but BASE.rpm may be missing.
|
|
|
|
+ https://bugzilla.redhat.com/show_bug.cgi?id=981154 */
|
|
|
|
+ link0_resolved = link_resolve (link0, 0);
|
|
|
|
+ xfree (link0);
|
2014-02-10 17:10:42 +00:00
|
|
|
+
|
2013-09-11 13:42:29 +00:00
|
|
|
+ if (link_all == NULL)
|
2014-02-10 17:10:42 +00:00
|
|
|
+ link_all = link0_resolved;
|
2013-09-11 13:42:29 +00:00
|
|
|
+ else
|
2014-02-10 17:10:42 +00:00
|
|
|
+ {
|
2013-09-11 13:42:29 +00:00
|
|
|
+ size_t len_orig = strlen (link_all);
|
2009-11-23 12:19:03 +00:00
|
|
|
+
|
2017-02-15 16:05:56 +00:00
|
|
|
+ link_all = (char *) xrealloc (link_all,
|
|
|
|
+ len_orig + 1 + strlen (link0_resolved) + 1);
|
2009-11-23 12:19:03 +00:00
|
|
|
+
|
2013-09-11 13:42:29 +00:00
|
|
|
+ /* Use whitespace instead of DIRNAME_SEPARATOR to be compatible with
|
|
|
|
+ its possible use as an argument for installation command. */
|
|
|
|
+ link_all[len_orig] = ' ';
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
+
|
2013-09-11 13:42:29 +00:00
|
|
|
+ strcpy (&link_all[len_orig + 1], link0_resolved);
|
2014-02-10 17:10:42 +00:00
|
|
|
+ xfree (link0_resolved);
|
|
|
|
+ }
|
2012-06-16 04:55:29 +00:00
|
|
|
+ }
|
2014-02-10 17:10:42 +00:00
|
|
|
+
|
2009-05-04 16:53:01 +00:00
|
|
|
+ if (link_return != NULL)
|
2009-11-23 12:19:03 +00:00
|
|
|
+ {
|
2014-02-10 17:10:42 +00:00
|
|
|
+ if (abfd != NULL)
|
2013-09-11 13:42:29 +00:00
|
|
|
+ {
|
|
|
|
+ *link_return = link;
|
|
|
|
+ link = NULL;
|
|
|
|
+ }
|
2009-11-23 12:19:03 +00:00
|
|
|
+ else
|
2013-09-11 13:42:29 +00:00
|
|
|
+ {
|
|
|
|
+ *link_return = link_all;
|
|
|
|
+ link_all = NULL;
|
|
|
|
+ }
|
2012-06-16 04:55:29 +00:00
|
|
|
}
|
2009-11-23 12:19:03 +00:00
|
|
|
+ xfree (link);
|
|
|
|
+ xfree (link_all);
|
2012-06-16 04:55:29 +00:00
|
|
|
|
|
|
|
do_cleanups (back_to);
|
2014-02-10 17:10:42 +00:00
|
|
|
return abfd;
|
2012-06-16 04:55:29 +00:00
|
|
|
}
|
|
|
|
|
2014-02-10 17:10:42 +00:00
|
|
|
+char *
|
2016-01-14 17:05:52 +00:00
|
|
|
+build_id_to_filename (const struct bfd_build_id *build_id, char **link_return)
|
2014-02-10 17:10:42 +00:00
|
|
|
+{
|
2017-05-01 01:04:39 +00:00
|
|
|
+ gdb_bfd_ref_ptr abfd;
|
2014-02-10 17:10:42 +00:00
|
|
|
+ char *result;
|
|
|
|
+
|
|
|
|
+ abfd = build_id_to_debug_bfd (build_id->size, build_id->data, link_return, 0);
|
|
|
|
+ if (abfd == NULL)
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ result = xstrdup (bfd_get_filename (abfd));
|
2017-05-01 01:04:39 +00:00
|
|
|
+ abfd.release ();
|
2014-02-10 17:10:42 +00:00
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
2009-05-04 16:53:01 +00:00
|
|
|
+/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
|
|
|
|
+ Try to install the hash file ...
|
|
|
|
+ avoidance. */
|
|
|
|
+
|
|
|
|
+struct missing_filepair
|
|
|
|
+ {
|
|
|
|
+ char *binary;
|
|
|
|
+ char *debug;
|
|
|
|
+ char data[1];
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+static struct htab *missing_filepair_hash;
|
|
|
|
+static struct obstack missing_filepair_obstack;
|
|
|
|
+
|
|
|
|
+static void *
|
|
|
|
+missing_filepair_xcalloc (size_t nmemb, size_t nmemb_size)
|
|
|
|
+{
|
|
|
|
+ void *retval;
|
|
|
|
+ size_t size = nmemb * nmemb_size;
|
|
|
|
+
|
|
|
|
+ retval = obstack_alloc (&missing_filepair_obstack, size);
|
|
|
|
+ memset (retval, 0, size);
|
2012-06-16 04:55:29 +00:00
|
|
|
+ return retval;
|
|
|
|
+}
|
|
|
|
+
|
2009-05-04 16:53:01 +00:00
|
|
|
+static hashval_t
|
|
|
|
+missing_filepair_hash_func (const struct missing_filepair *elem)
|
|
|
|
+{
|
|
|
|
+ hashval_t retval = 0;
|
|
|
|
+
|
|
|
|
+ retval ^= htab_hash_string (elem->binary);
|
|
|
|
+ if (elem->debug != NULL)
|
|
|
|
+ retval ^= htab_hash_string (elem->debug);
|
|
|
|
+
|
|
|
|
+ return retval;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int
|
|
|
|
+missing_filepair_eq (const struct missing_filepair *elem1,
|
|
|
|
+ const struct missing_filepair *elem2)
|
|
|
|
+{
|
|
|
|
+ return strcmp (elem1->binary, elem2->binary) == 0
|
2009-07-29 15:48:42 +00:00
|
|
|
+ && ((elem1->debug == NULL) == (elem2->debug == NULL))
|
|
|
|
+ && (elem1->debug == NULL || strcmp (elem1->debug, elem2->debug) == 0);
|
2009-05-04 16:53:01 +00:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+missing_filepair_change (void)
|
|
|
|
+{
|
|
|
|
+ if (missing_filepair_hash != NULL)
|
|
|
|
+ {
|
|
|
|
+ obstack_free (&missing_filepair_obstack, NULL);
|
|
|
|
+ /* All their memory came just from missing_filepair_OBSTACK. */
|
|
|
|
+ missing_filepair_hash = NULL;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+debug_print_executable_changed (void)
|
|
|
|
+{
|
|
|
|
+ missing_filepair_change ();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Notify user the file BINARY with (possibly NULL) associated separate debug
|
|
|
|
+ information file DEBUG is missing. DEBUG may or may not be the build-id
|
|
|
|
+ file such as would be:
|
|
|
|
+ /usr/lib/debug/.build-id/dd/b1d2ce632721c47bb9e8679f369e2295ce71be.debug
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+void
|
|
|
|
+debug_print_missing (const char *binary, const char *debug)
|
|
|
|
+{
|
|
|
|
+ size_t binary_len0 = strlen (binary) + 1;
|
|
|
|
+ size_t debug_len0 = debug ? strlen (debug) + 1 : 0;
|
2009-07-29 15:48:42 +00:00
|
|
|
+ struct missing_filepair missing_filepair_find;
|
2009-05-04 16:53:01 +00:00
|
|
|
+ struct missing_filepair *missing_filepair;
|
|
|
|
+ struct missing_filepair **slot;
|
|
|
|
+
|
|
|
|
+ if (build_id_verbose < BUILD_ID_VERBOSE_FILENAMES)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (missing_filepair_hash == NULL)
|
|
|
|
+ {
|
|
|
|
+ obstack_init (&missing_filepair_obstack);
|
|
|
|
+ missing_filepair_hash = htab_create_alloc (64,
|
|
|
|
+ (hashval_t (*) (const void *)) missing_filepair_hash_func,
|
|
|
|
+ (int (*) (const void *, const void *)) missing_filepair_eq, NULL,
|
|
|
|
+ missing_filepair_xcalloc, NULL);
|
|
|
|
+ }
|
|
|
|
+
|
2009-07-29 15:48:42 +00:00
|
|
|
+ /* Use MISSING_FILEPAIR_FIND first instead of calling obstack_alloc with
|
|
|
|
+ obstack_free in the case of a (rare) match. The problem is ALLOC_F for
|
|
|
|
+ MISSING_FILEPAIR_HASH allocates from MISSING_FILEPAIR_OBSTACK maintenance
|
|
|
|
+ structures for MISSING_FILEPAIR_HASH. Calling obstack_free would possibly
|
|
|
|
+ not to free only MISSING_FILEPAIR but also some such structures (allocated
|
|
|
|
+ during the htab_find_slot call). */
|
|
|
|
+
|
|
|
|
+ missing_filepair_find.binary = (char *) binary;
|
|
|
|
+ missing_filepair_find.debug = (char *) debug;
|
|
|
|
+ slot = (struct missing_filepair **) htab_find_slot (missing_filepair_hash,
|
|
|
|
+ &missing_filepair_find,
|
|
|
|
+ INSERT);
|
|
|
|
+
|
|
|
|
+ /* While it may be still printed duplicitely with the missing debuginfo file
|
|
|
|
+ * it is due to once printing about the binary file build-id link and once
|
|
|
|
+ * about the .debug file build-id link as both the build-id symlinks are
|
|
|
|
+ * located in the debuginfo package. */
|
|
|
|
+
|
|
|
|
+ if (*slot != NULL)
|
|
|
|
+ return;
|
|
|
|
+
|
2017-02-15 16:05:56 +00:00
|
|
|
+ missing_filepair = (struct missing_filepair *) obstack_alloc (&missing_filepair_obstack,
|
|
|
|
+ sizeof (*missing_filepair) - 1
|
|
|
|
+ + binary_len0 + debug_len0);
|
2009-05-04 16:53:01 +00:00
|
|
|
+ missing_filepair->binary = missing_filepair->data;
|
|
|
|
+ memcpy (missing_filepair->binary, binary, binary_len0);
|
|
|
|
+ if (debug != NULL)
|
|
|
|
+ {
|
|
|
|
+ missing_filepair->debug = missing_filepair->binary + binary_len0;
|
|
|
|
+ memcpy (missing_filepair->debug, debug, debug_len0);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ missing_filepair->debug = NULL;
|
|
|
|
+
|
|
|
|
+ *slot = missing_filepair;
|
|
|
|
+
|
|
|
|
+ /* We do not collect and flush these messages as each such message
|
|
|
|
+ already requires its own separate lines. */
|
|
|
|
+
|
|
|
|
+ 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);
|
|
|
|
+}
|
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
/* See build-id.h. */
|
|
|
|
|
|
|
|
char *
|
2010-04-16 16:29:50 +00:00
|
|
|
-find_separate_debug_file_by_buildid (struct objfile *objfile)
|
|
|
|
+find_separate_debug_file_by_buildid (struct objfile *objfile,
|
2017-05-01 01:04:39 +00:00
|
|
|
+ gdb::unique_xmalloc_ptr<char> *build_id_filename_return)
|
2009-05-04 16:53:01 +00:00
|
|
|
{
|
2016-01-14 17:05:52 +00:00
|
|
|
const struct bfd_build_id *build_id;
|
2009-05-04 16:53:01 +00:00
|
|
|
|
|
|
|
- build_id = build_id_bfd_get (objfile->obfd);
|
2010-04-16 16:29:50 +00:00
|
|
|
+ if (build_id_filename_return)
|
|
|
|
+ *build_id_filename_return = NULL;
|
|
|
|
+
|
2009-05-04 16:53:01 +00:00
|
|
|
+ build_id = build_id_bfd_shdr_get (objfile->obfd);
|
|
|
|
if (build_id != NULL)
|
|
|
|
{
|
2017-05-01 01:04:39 +00:00
|
|
|
+ char *build_id_filename_cstr = NULL;
|
|
|
|
gdb_bfd_ref_ptr abfd (build_id_to_debug_bfd (build_id->size,
|
|
|
|
- build_id->data));
|
|
|
|
+ build_id->data,
|
|
|
|
+ (!build_id_filename_return ? NULL : &build_id_filename_cstr), 1));
|
|
|
|
+ if (build_id_filename_return)
|
|
|
|
+ {
|
|
|
|
+ if (!build_id_filename_cstr)
|
|
|
|
+ gdb_assert (!*build_id_filename_return);
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ *build_id_filename_return = gdb::unique_xmalloc_ptr<char> (build_id_filename_cstr);
|
|
|
|
+ build_id_filename_cstr = NULL;
|
|
|
|
+ }
|
|
|
|
+ }
|
2009-05-04 16:53:01 +00:00
|
|
|
/* Prevent looping on a stripped .debug file. */
|
2014-02-10 17:10:42 +00:00
|
|
|
if (abfd != NULL
|
2017-05-01 01:04:39 +00:00
|
|
|
&& filename_cmp (bfd_get_filename (abfd.get ()),
|
|
|
|
@@ -160,3 +837,21 @@
|
2009-05-04 16:53:01 +00:00
|
|
|
}
|
2010-04-16 16:29:50 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
+extern void _initialize_build_id (void);
|
2010-04-16 16:29:50 +00:00
|
|
|
+
|
2014-02-10 17:10:42 +00:00
|
|
|
+void
|
|
|
|
+_initialize_build_id (void)
|
|
|
|
+{
|
2010-04-16 16:29:50 +00:00
|
|
|
+ add_setshow_zinteger_cmd ("build-id-verbose", no_class, &build_id_verbose,
|
|
|
|
+ _("\
|
|
|
|
+Set debugging level of the build-id locator."), _("\
|
|
|
|
+Show debugging level of the build-id locator."), _("\
|
|
|
|
+Level 1 (default) enables printing the missing debug filenames,\n\
|
|
|
|
+level 2 also prints the parsing of binaries to find the identificators."),
|
|
|
|
+ NULL,
|
|
|
|
+ show_build_id_verbose,
|
|
|
|
+ &setlist, &showlist);
|
|
|
|
+
|
|
|
|
+ observer_attach_executable_changed (debug_print_executable_changed);
|
2014-02-10 17:10:42 +00:00
|
|
|
+}
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/build-id.h
|
2009-05-04 16:53:01 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/build-id.h 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/build-id.h 2017-04-20 23:00:43.371629257 +0200
|
|
|
|
@@ -22,9 +22,10 @@
|
|
|
|
|
|
|
|
#include "gdb_bfd.h"
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
|
|
|
|
-/* Locate NT_GNU_BUILD_ID from ABFD and return its content. */
|
|
|
|
+/* Separate debuginfo files have corrupted PHDR but SHDR is correct there.
|
|
|
|
+ Locate NT_GNU_BUILD_ID from ABFD and return its content. */
|
|
|
|
|
2016-01-14 17:05:52 +00:00
|
|
|
-extern const struct bfd_build_id *build_id_bfd_get (bfd *abfd);
|
|
|
|
+extern const struct bfd_build_id *build_id_bfd_shdr_get (bfd *abfd);
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
|
|
|
|
/* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value.
|
|
|
|
Otherwise, issue a warning and return false. */
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -38,13 +39,19 @@
|
2014-02-10 17:10:42 +00:00
|
|
|
the caller. */
|
2009-05-04 16:53:01 +00:00
|
|
|
|
2017-05-01 01:04:39 +00:00
|
|
|
extern gdb_bfd_ref_ptr build_id_to_debug_bfd (size_t build_id_len,
|
|
|
|
- const bfd_byte *build_id);
|
|
|
|
+ const bfd_byte *build_id,
|
|
|
|
+ char **link_return,
|
|
|
|
+ int add_debug_suffix);
|
2009-05-04 16:53:01 +00:00
|
|
|
+
|
2016-01-14 17:05:52 +00:00
|
|
|
+extern char *build_id_to_filename (const struct bfd_build_id *build_id,
|
2014-02-10 17:10:42 +00:00
|
|
|
+ char **link_return);
|
2009-05-04 16:53:01 +00:00
|
|
|
|
2014-02-10 17:10:42 +00:00
|
|
|
/* Find the separate debug file for OBJFILE, by using the build-id
|
|
|
|
associated with OBJFILE's BFD. If successful, returns a malloc'd
|
|
|
|
file name for the separate debug file. The caller must free this.
|
|
|
|
Otherwise, returns NULL. */
|
|
|
|
|
|
|
|
-extern char *find_separate_debug_file_by_buildid (struct objfile *objfile);
|
|
|
|
+extern char *find_separate_debug_file_by_buildid (struct objfile *objfile,
|
2017-05-01 01:04:39 +00:00
|
|
|
+ gdb::unique_xmalloc_ptr<char> *build_id_filename_return);
|
2009-05-04 16:53:01 +00:00
|
|
|
|
2014-02-10 17:10:42 +00:00
|
|
|
#endif /* BUILD_ID_H */
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/dwarf2read.c
|
2009-08-11 16:28:33 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/dwarf2read.c 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/dwarf2read.c 2017-04-20 23:00:43.375629279 +0200
|
|
|
|
@@ -2671,7 +2671,7 @@
|
2009-05-04 16:53:01 +00:00
|
|
|
}
|
2009-10-12 14:27:52 +00:00
|
|
|
|
2014-02-10 17:10:42 +00:00
|
|
|
if (dwz_bfd == NULL)
|
|
|
|
- dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid);
|
|
|
|
+ dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid, NULL, 1);
|
2013-01-11 14:55:20 +00:00
|
|
|
|
2014-02-10 17:10:42 +00:00
|
|
|
if (dwz_bfd == NULL)
|
|
|
|
error (_("could not find '.gnu_debugaltlink' file for %s"),
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/python/py-objfile.c
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/python/py-objfile.c 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/python/py-objfile.c 2017-04-20 23:00:43.375629279 +0200
|
|
|
|
@@ -137,7 +137,7 @@
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
|
2016-01-14 17:05:52 +00:00
|
|
|
TRY
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
{
|
|
|
|
- build_id = build_id_bfd_get (objfile->obfd);
|
|
|
|
+ build_id = build_id_bfd_shdr_get (objfile->obfd);
|
|
|
|
}
|
2016-01-14 17:05:52 +00:00
|
|
|
CATCH (except, RETURN_MASK_ALL)
|
|
|
|
{
|
2017-05-01 01:04:39 +00:00
|
|
|
@@ -544,7 +544,7 @@
|
- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9.
The GDB 7.8 features are:
* Python Scripting
- You can now access frame registers from Python scripts.
- New attribute 'producer' for gdb.Symtab objects.
* New Python-based convenience functions:
- $_caller_is(name [, number_of_frames])
- $_caller_matches(regexp [, number_of_frames])
- $_any_caller_is(name [, number_of_frames])
- $_any_caller_matches(regexp [, number_of_frames])
* New commands
- queue-signal signal-name-or-number
Queue a signal to be delivered to the thread when it is resumed.
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
always) deliver the signal to the thread that happens to be current
at resume time.
* Conversely, the "signal" command now consistently delivers the
requested signal to the current thread. GDB now asks for
confirmation if the program had stopped for a signal and the user
switched threads meanwhile.
* "breakpoint always-inserted" modes "off" and "auto" merged.
Now, when 'breakpoint always-inserted mode' is set to "off", GDB
won't remove breakpoints from the target until all threads stop,
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
* MI changes
- The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=115
2015-02-25 13:45:10 +00:00
|
|
|
/* Don't return separate debug files. */
|
|
|
|
if (objfile->separate_debug_objfile_backlink != NULL)
|
|
|
|
continue;
|
|
|
|
- obfd_build_id = build_id_bfd_get (objfile->obfd);
|
|
|
|
+ obfd_build_id = build_id_bfd_shdr_get (objfile->obfd);
|
|
|
|
if (obfd_build_id == NULL)
|
|
|
|
continue;
|
|
|
|
if (objfpy_build_id_matches (obfd_build_id, build_id))
|
2017-05-01 01:04:39 +00:00
|
|
|
Index: gdb-7.99.90.20170420/gdb/coffread.c
|
2016-01-14 17:05:52 +00:00
|
|
|
===================================================================
|
2017-05-01 01:04:39 +00:00
|
|
|
--- gdb-7.99.90.20170420.orig/gdb/coffread.c 2017-04-20 23:00:35.415584426 +0200
|
|
|
|
+++ gdb-7.99.90.20170420/gdb/coffread.c 2017-04-20 23:00:43.376629285 +0200
|
|
|
|
@@ -734,7 +734,7 @@
|
2016-01-14 17:05:52 +00:00
|
|
|
{
|
|
|
|
char *debugfile;
|
|
|
|
|
|
|
|
- debugfile = find_separate_debug_file_by_buildid (objfile);
|
|
|
|
+ debugfile = find_separate_debug_file_by_buildid (objfile, NULL);
|
|
|
|
|
|
|
|
if (debugfile == NULL)
|
|
|
|
debugfile = find_separate_debug_file_by_debuglink (objfile);
|