This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] [ARC] Parse NOTE section in core dump files
- From: Anton Kolesov <Anton dot Kolesov at synopsys dot com>
- To: binutils at sourceware dot org
- Cc: Anton Kolesov <Anton dot Kolesov at synopsys dot com>, Francois dot Bedard at synopsys dot com, Claudiu dot Zissulescu at synopsys dot com, Cupertino Miranda <Cupertino dot Miranda at synopsys dot com>
- Date: Mon, 22 Aug 2016 20:22:23 +0300
- Subject: [PATCH] [ARC] Parse NOTE section in core dump files
- Authentication-results: sourceware.org; auth=none
This patch adds function elf32_arc_grok_parse to parse NOTE section of core
dump files. GDB requires this to work properly with core dumps.
GDB expects general purpose registers to be in the section .reg. However Linux
kernel doesn't create this section and instead writes registers to NOTE
section. It is up to BFD to create a pseudosection .reg from the
contents of NOTE. This patch adds this functionality to the ARC. Also BFD
will read from NOTE process id and signal number that caused failure. This
function relies on offsets inside elf_prstatus structure in Linux.
This solution is similar to what other architectures use, for example
elf32_arm_nabi_grok_prstatus or elf32_mips_grok_prstatus.
bfd/
* elf32-arc.c (elf32_arc_grok_prstatus): New function.
---
bfd/elf32-arc.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
index 00828be..89a2b52 100644
--- a/bfd/elf32-arc.c
+++ b/bfd/elf32-arc.c
@@ -2439,6 +2439,39 @@ elf_arc_add_symbol_hook (bfd * abfd,
return TRUE;
}
+/* GDB expects general purpose registers to be in section .reg. However Linux
+ kernel doesn't create this section and instead writes registers to NOTE
+ section. It is up to the binutils to create a pseudo-section .reg from the
+ contents of NOTE. Also BFD will read pid and signal number from NOTE. This
+ function relies on offsets inside elf_prstatus structure in Linux to be
+ stable. */
+
+static bfd_boolean
+elf32_arc_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
+{
+ int offset;
+ size_t size;
+
+ switch (note->descsz)
+ {
+ default:
+ return FALSE;
+
+ case 236: /* sizeof (struct elf_prstatus) on Linux/arc. */
+ /* pr_cursig */
+ elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
+ /* pr_pid */
+ elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
+ /* pr_regs */
+ offset = 72;
+ size = (40 * 4); /* There are 40 registers in user_regs_struct. */
+ break;
+ }
+ /* Make a ".reg/999" section. */
+ return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
+ note->descpos + offset);
+}
+
#define TARGET_LITTLE_SYM arc_elf32_le_vec
#define TARGET_LITTLE_NAME "elf32-littlearc"
#define TARGET_BIG_SYM arc_elf32_be_vec
@@ -2484,6 +2517,8 @@ elf_arc_add_symbol_hook (bfd * abfd,
#define elf_backend_may_use_rela_p 1
#define elf_backend_default_use_rela_p 1
+#define elf_backend_grok_prstatus elf32_arc_grok_prstatus
+
#define elf_backend_default_execstack 0
#include "elf32-target.h"
--
2.8.1