| Index: gdb/gcore.c
|
| diff --git a/gdb/gcore.c b/gdb/gcore.c
|
| index f9e7590f907e24a80d8ac9b187cca019b7c01605..aedda412eb6771adccb86983cdb977a4c3ccd748 100644
|
| --- a/gdb/gcore.c
|
| +++ b/gdb/gcore.c
|
| @@ -71,35 +71,37 @@ write_gcore_file (bfd *obfd)
|
| asection *note_sec = NULL;
|
|
|
| /* An external target method must build the notes section. */
|
| - note_data = target_make_corefile_notes (obfd, ¬e_size);
|
| + /* FIXME: uweigand/2011-10-06: All architectures that support core file
|
| + generation should be converted to gdbarch_make_corefile_notes; at that
|
| + point, the target vector method can be removed. */
|
| + if (!gdbarch_make_corefile_notes_p (target_gdbarch))
|
| + note_data = target_make_corefile_notes (obfd, ¬e_size);
|
| + else
|
| + note_data = gdbarch_make_corefile_notes (target_gdbarch, obfd, ¬e_size);
|
|
|
| - /* Create the note section. */
|
| - if (note_data != NULL && note_size != 0)
|
| - {
|
| - note_sec = bfd_make_section_anyway_with_flags (obfd, "note0",
|
| - SEC_HAS_CONTENTS
|
| - | SEC_READONLY
|
| - | SEC_ALLOC);
|
| - if (note_sec == NULL)
|
| - error (_("Failed to create 'note' section for corefile: %s"),
|
| - bfd_errmsg (bfd_get_error ()));
|
| + if (note_data == NULL || note_size == 0)
|
| + error (_("Target does not support core file generation."));
|
|
|
| - bfd_set_section_vma (obfd, note_sec, 0);
|
| - bfd_set_section_alignment (obfd, note_sec, 0);
|
| - bfd_set_section_size (obfd, note_sec, note_size);
|
| - }
|
| + /* Create the note section. */
|
| + note_sec = bfd_make_section_anyway_with_flags (obfd, "note0",
|
| + SEC_HAS_CONTENTS
|
| + | SEC_READONLY
|
| + | SEC_ALLOC);
|
| + if (note_sec == NULL)
|
| + error (_("Failed to create 'note' section for corefile: %s"),
|
| + bfd_errmsg (bfd_get_error ()));
|
| +
|
| + bfd_set_section_vma (obfd, note_sec, 0);
|
| + bfd_set_section_alignment (obfd, note_sec, 0);
|
| + bfd_set_section_size (obfd, note_sec, note_size);
|
|
|
| /* Now create the memory/load sections. */
|
| if (gcore_memory_sections (obfd) == 0)
|
| error (_("gcore: failed to get corefile memory sections from target."));
|
|
|
| /* Write out the contents of the note section. */
|
| - if (note_data != NULL && note_size != 0)
|
| - {
|
| - if (!bfd_set_section_contents (obfd, note_sec, note_data, 0, note_size))
|
| - warning (_("writing note section (%s)"),
|
| - bfd_errmsg (bfd_get_error ()));
|
| - }
|
| + if (!bfd_set_section_contents (obfd, note_sec, note_data, 0, note_size))
|
| + warning (_("writing note section (%s)"), bfd_errmsg (bfd_get_error ()));
|
| }
|
|
|
| static void
|
| @@ -559,8 +561,14 @@ gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
|
| static int
|
| gcore_memory_sections (bfd *obfd)
|
| {
|
| - if (target_find_memory_regions (gcore_create_callback, obfd) != 0)
|
| - return 0; /* FIXME: error return/msg? */
|
| + /* Try gdbarch method first, then fall back to target method. */
|
| + if (!gdbarch_find_memory_regions_p (target_gdbarch)
|
| + || gdbarch_find_memory_regions (target_gdbarch,
|
| + gcore_create_callback, obfd) != 0)
|
| + {
|
| + if (target_find_memory_regions (gcore_create_callback, obfd) != 0)
|
| + return 0; /* FIXME: error return/msg? */
|
| + }
|
|
|
| /* Record phdrs for section-to-segment mapping. */
|
| bfd_map_over_sections (obfd, make_output_phdrs, NULL);
|
|
|