X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fcorelow.c;h=10942e6af01fe2859ec175922fd52dfed70ef226;hb=7c80aab93666727965c2d5d6e17b1338d88293e0;hp=a4c1f6354c6e427ca449e9e3f6fc7e5c09e45bd0;hpb=fadf6add3028d477457c809f60f07643964d7fd2;p=binutils-gdb.git diff --git a/gdb/corelow.c b/gdb/corelow.c index a4c1f6354c6..10942e6af01 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -154,8 +154,22 @@ 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; + 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"), @@ -200,7 +214,7 @@ core_target::build_file_mappings () /* read_core_file_mappings will invoke this lambda for each mapping that it finds. */ [&] (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, - const char *filename) + const char *filename, const bfd_build_id *build_id) { /* Architecture-specific read_core_mapping methods are expected to weed out non-file-backed mappings. */ @@ -414,7 +428,8 @@ core_target_open (const char *arg, int from_tty) } gdb::unique_xmalloc_ptr filename (tilde_expand (arg)); - if (!IS_ABSOLUTE_PATH (filename.get ())) + if (strlen (filename.get ()) != 0 + && !IS_ABSOLUTE_PATH (filename.get ())) filename = gdb_abspath (filename.get ()); flags = O_BINARY | O_LARGEFILE; @@ -422,7 +437,7 @@ core_target_open (const char *arg, int from_tty) flags |= O_RDWR; else flags |= O_RDONLY; - scratch_chan = gdb_open_cloexec (filename.get (), flags, 0); + scratch_chan = gdb_open_cloexec (filename.get (), flags, 0).release (); if (scratch_chan < 0) perror_with_name (filename.get ()); @@ -458,7 +473,7 @@ core_target_open (const char *arg, int from_tty) if (!current_program_space->exec_bfd ()) set_gdbarch_from_file (core_bfd); - push_target (std::move (target_holder)); + current_inferior ()->push_target (std::move (target_holder)); switch_to_no_thread ();