This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 3/4] BFD: Fix reading Linux core PRSTATUS note for MIPS n32
- From: Djordje Todorovic <djordje dot todorovic at rt-rk dot com>
- To: "Maciej W. Rozycki" <macro at imgtec dot com>
- Cc: binutils at sourceware dot org, gdb-patches at sourceware dot org, "nemanja dot popov at rt-rk dot com" <nemanja dot popov at rt-rk dot com>, Nikola Prica <nikola dot prica at rt-rk dot com>, petar dot jovanovic at rt-rk dot com, "Ananthakrishna Sowda (asowda)" <asowda at cisco dot com>
- Date: Fri, 6 Oct 2017 13:03:48 +0200
- Subject: [PATCH 3/4] BFD: Fix reading Linux core PRSTATUS note for MIPS n32
- Authentication-results: sourceware.org; auth=none
The kernel struct elf_prstatus which GDB MIPS n32 uses is defined as following:
(top-gdb-mipsN32) ptype struct elf_prstatus
type = struct elf_prstatus {
struct elf_siginfo pr_info;
short pr_cursig;
unsigned long long pr_sigpend;
unsigned long long pr_sighold;
__pid_t pr_pid;
__pid_t pr_ppid;
__pid_t pr_pgrp;
__pid_t pr_sid;
struct timeval pr_utime;
struct timeval pr_stime;
struct timeval pr_cutime;
struct timeval pr_cstime;
elf_gregset_t pr_reg;
int pr_fpvalid;
}
and the size of the structure is not right in the current source code, because:
(top-gdb-mipsN32) p sizeof(struct elf_prstatus)
$1 = 448
Also, offset of the pr_pid and pr_reg have to be corrected:
(top-gdb-mipsN32) print /d &((struct elf_prstatus *)0)->pr_reg
$2 = 80
(top-gdb-mipsN32) print /d &((struct elf_prstatus *)0)->pr_pid
$3 = 32
Also, it is detected that on MIPS n32 platform, GDB has never called functions for reading Linux core PRPSINFO and PRSTATUS note defined in bfd/elfn32-mips.c, but GDB MIPS n32
currently uses functions from bfd/elf32-mips.c. I am not sure if it is expected, but 'elf32_mips_grok_psinfo' from bfd/elfn32-mips.c is exactly the same as one from
bfd/elf32-mips.c, because GDB MIPS n32 uses exactly the same struct elf_prpsinfo and there is no problem for end users. But, when GDB MIPS n32 comes into 'elf32_mips_grok_prstatus'
from bfd/elf32-mips.c, it would never go into 'case 256' of the 'switch' because the size of struct elf_prstatus is different on MIPS n32.
So, I have also noticed when GDB MIPS n32 generates core file it calls proper functions for it (from bfd/elfn32-mips.c) because target vector points to the proper architecture:
(gdb) gcore
Breakpoint 1, elf32_mips_write_core_note (abfd=0x10b329e8, buf=0x10b32d88 "", bufsiz=0x7fff5fec,
note_type=1) at ../../binutils-gdb/bfd/elfn32-mips.c:3590
3590 switch (note_type)
(top-gdb-mipsN32) p abfd->xvec
$4 = (const struct bfd_target *) 0x10869010 <mips_elf32_ntrad_be_vec>
but when reads the core file it looks as following:
...
(top-gdb-mipsN32) c
Continuing.
A program is being debugged already. Kill it? (y or n) y
Breakpoint 2, elf32_mips_grok_prstatus (abfd=0x10ac9a58, note=0x7fff5d08)
at ../../binutils-gdb/bfd/elf32-mips.c:2323
2323 switch (note->descsz)
(top-gdb-mipsN32) p abfd->xvec
$5 = (const struct bfd_target *) 0x1085a318 <mips_elf32_trad_be_vec>
Even GDB MIPS n32 does not use the function by current design, at least on my MIPS board, the patch looks as following:
From 918226ecebb699916e7e3f3e0f5befa2602b8708 Mon Sep 17 00:00:00 2001
From: Djordje Todorovic <djordje.todorovic@rt-rk.com>
Date: Wed, 4 Oct 2017 15:01:00 +0200
Subject: [PATCH 3/4] BFD: Fix reading Linux core PRSTATUS note for MIPS n32
bfd/ChangeLog:
* bfd/elfn32-mips (elf32_mips_grok_prstatus): Fix pr_pid and
pr_reg offsets and size of struct elf_prstatus.
---
bfd/elfn32-mips.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
index 5287da3..07793b6 100644
--- a/bfd/elfn32-mips.c
+++ b/bfd/elfn32-mips.c
@@ -3530,15 +3530,15 @@ elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
default:
return FALSE;
- case 440: /* Linux/MIPS N32 */
+ case 448: /* Linux/MIPS N32 */
/* 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);
+ elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
/* pr_reg */
- offset = 72;
+ offset = 80;
size = 360;
break;
--
2.7.4