aboutsummaryrefslogtreecommitdiff
path: root/gdb/corelow.c
diff options
context:
space:
mode:
authorLuis Machado <luis.machado@linaro.org>2021-05-17 11:41:09 -0300
committerLuis Machado <luis.machado@linaro.org>2021-06-25 10:08:38 -0300
commit134df964367c19afa2eef81a0841fe1c181a9edc (patch)
tree8a10b6e451b6d0fd6824840b1177df1214c4f805 /gdb/corelow.c
parenta7cde6df4039dc575469430bbb7caa4706840d93 (diff)
downloadbinutils-134df964367c19afa2eef81a0841fe1c181a9edc.zip
binutils-134df964367c19afa2eef81a0841fe1c181a9edc.tar.gz
binutils-134df964367c19afa2eef81a0841fe1c181a9edc.tar.bz2
Update the core file architecture if a target description is present
At the moment, the core target has its own gdbarch (m_core_gdbarch), and that gets set from the core_bfd on the core target's constructor. That gdbarch doesn't contain a target description because it is constructed before we get a chance to fetch the target description. As a result, some hooks that depend on the target description being set are not set, and that leads to problems. One of the examples is gdbarch_report_signal_info, which is used to show AArch64 tag violation information. Fix this by reading the target description before fetching the core file's gdbarch. gdb/ChangeLog: 2021-06-25 Luis Machado <luis.machado@linaro.org> * corelow.c (core_target::core_target) Update to read target description.
Diffstat (limited to 'gdb/corelow.c')
-rw-r--r--gdb/corelow.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/gdb/corelow.c b/gdb/corelow.c
index a1943ab..b762eaa 100644
--- a/gdb/corelow.c
+++ b/gdb/corelow.c
@@ -154,8 +154,23 @@ private: /* per-core data */
core_target::core_target ()
{
+ /* Find a first arch based on the BFD. We need the initial gdbarch so
+ we can setup the hooks to find a target description. */
m_core_gdbarch = gdbarch_from_bfd (core_bfd);
+ /* If the arch is able to read a target description from the core, it
+ could yield a more specific gdbarch. */
+ const struct target_desc *tdesc = read_description ();
+
+ if (tdesc != nullptr)
+ {
+ struct gdbarch_info info;
+ gdbarch_info_init (&info);
+ info.abfd = core_bfd;
+ info.target_desc = tdesc;
+ m_core_gdbarch = gdbarch_find_by_info (info);
+ }
+
if (!m_core_gdbarch
|| !gdbarch_iterate_over_regset_sections_p (m_core_gdbarch))
error (_("\"%s\": Core file format not supported"),