Slight cleanup to ELF core file handing, and add support for

NetBSD-style ELF core files.
This commit is contained in:
thorpej 2001-12-09 23:21:07 +00:00
parent 91c4b48914
commit a4ea757e28
3 changed files with 62 additions and 32 deletions

View File

@ -44,8 +44,6 @@
# Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de> # Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de>
# corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de> # corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
>>16 leshort 4 core file >>16 leshort 4 core file
>>>(0x38+0xcc) string >\0 of '%s'
>>>(0x38+0x10) lelong >0 (signal %d),
>>16 leshort &0xff00 processor-specific, >>16 leshort &0xff00 processor-specific,
>>18 leshort 0 no machine, >>18 leshort 0 no machine,
>>18 leshort 1 AT&T WE32100 - invalid byte order, >>18 leshort 1 AT&T WE32100 - invalid byte order,
@ -115,8 +113,6 @@
>>16 beshort 2 executable, >>16 beshort 2 executable,
>>16 beshort 3 shared object, >>16 beshort 3 shared object,
>>16 beshort 4 core file, >>16 beshort 4 core file,
>>>(0x38+0xcc) string >\0 of '%s'
>>>(0x38+0x10) belong >0 (signal %d),
>>16 beshort &0xff00 processor-specific, >>16 beshort &0xff00 processor-specific,
>>18 beshort 0 no machine, >>18 beshort 0 no machine,
>>18 beshort 1 AT&T WE32100, >>18 beshort 1 AT&T WE32100,

View File

@ -1,4 +1,4 @@
/* $NetBSD: readelf.c,v 1.9 2000/11/23 23:21:15 pooka Exp $ */ /* $NetBSD: readelf.c,v 1.10 2001/12/09 23:21:07 thorpej Exp $ */
#include "file.h" #include "file.h"
@ -20,7 +20,7 @@
#if 0 #if 0
FILE_RCSID("@(#)Id: readelf.c,v 1.17 2000/08/05 19:00:12 christos Exp ") FILE_RCSID("@(#)Id: readelf.c,v 1.17 2000/08/05 19:00:12 christos Exp ")
#else #else
__RCSID("$NetBSD: readelf.c,v 1.9 2000/11/23 23:21:15 pooka Exp $"); __RCSID("$NetBSD: readelf.c,v 1.10 2001/12/09 23:21:07 thorpej Exp $");
#endif #endif
#endif #endif
@ -237,6 +237,17 @@ size_t prpsoffsets64[] = {
* *do* have that binary, the debugger will probably tell you what * *do* have that binary, the debugger will probably tell you what
* signal it was.) * signal it was.)
*/ */
#define OS_STYLE_SVR4 0
#define OS_STYLE_FREEBSD 1
#define OS_STYLE_NETBSD 2
static const char *os_style_names[] = {
"SVR4",
"FreeBSD",
"NetBSD",
};
static void static void
dophn_core(class, swap, fd, off, num, size) dophn_core(class, swap, fd, off, num, size)
int class; int class;
@ -255,7 +266,7 @@ dophn_core(class, swap, fd, off, num, size)
int i, j; int i, j;
char nbuf[BUFSIZ]; char nbuf[BUFSIZ];
int bufsize; int bufsize;
int is_freebsd; int os_style = -1;
/* /*
* Loop through all the program headers. * Loop through all the program headers.
@ -288,21 +299,9 @@ dophn_core(class, swap, fd, off, num, size)
nh64 = (Elf64_Nhdr *)&nbuf[offset]; nh64 = (Elf64_Nhdr *)&nbuf[offset];
offset += nh_size; offset += nh_size;
/*
* If this note isn't an NT_PRPSINFO note, it's
* not what we're looking for.
*/
if (nh_type != NT_PRPSINFO) {
offset += nh_namesz;
offset = ((offset + 3)/4)*4;
offset += nh_descsz;
offset = ((offset + 3)/4)*4;
continue;
}
/* /*
* Check whether this note has the name "CORE" or * Check whether this note has the name "CORE" or
* "FreeBSD". * "FreeBSD", or "NetBSD-CORE".
*/ */
if (offset + nh_namesz >= bufsize) { if (offset + nh_namesz >= bufsize) {
/* /*
@ -329,17 +328,50 @@ dophn_core(class, swap, fd, off, num, size)
* doesn't include the terminating null in the * doesn't include the terminating null in the
* name.... * name....
*/ */
if ((nh_namesz == 4 && if (os_style == -1) {
strncmp(&nbuf[nameoffset], "CORE", 4) == 0) || if ((nh_namesz == 4 &&
(nh_namesz == 5 && strncmp(&nbuf[nameoffset],
strcmp(&nbuf[nameoffset], "CORE") == 0)) "CORE", 4) == 0) ||
is_freebsd = 0; (nh_namesz == 5 &&
else if ((nh_namesz == 8 && strcmp(&nbuf[nameoffset],
strcmp(&nbuf[nameoffset], "FreeBSD") == 0)) "CORE") == 0)) {
is_freebsd = 1; os_style = OS_STYLE_SVR4;
else } else
continue; if ((nh_namesz == 8 &&
if (nh_type == NT_PRPSINFO) { strcmp(&nbuf[nameoffset],
"FreeBSD") == 0)) {
os_style = OS_STYLE_FREEBSD;
} else
if ((nh_namesz >= 11 &&
strncmp(&nbuf[nameoffset],
"NetBSD-CORE", 11) == 0)) {
os_style = OS_STYLE_NETBSD;
} else
continue;
printf(", %s-style", os_style_names[os_style]);
}
if (os_style == OS_STYLE_NETBSD &&
nh_type == NT_NETBSD_CORE_PROCINFO) {
uint32_t signo;
/*
* Extract the program name. It is at
* offset 0x7c, and is up to 32-bytes,
* including the terminating NUL.
*/
printf(", from '%.31s'", &nbuf[offset + 0x7c]);
/*
* Extract the signal number. It is at
* offset 0x08.
*/
memcpy(&signo, &nbuf[offset + 0x08],
sizeof(signo));
printf(" (signal %u)", getu32(swap, signo));
} else
if (os_style != OS_STYLE_NETBSD &&
nh_type == NT_PRPSINFO) {
/* /*
* Extract the program name. We assume * Extract the program name. We assume
* it to be 16 characters (that's what it * it to be 16 characters (that's what it

View File

@ -1,4 +1,4 @@
/* $NetBSD: readelf.h,v 1.5 1999/11/01 17:39:27 christos Exp $ */ /* $NetBSD: readelf.h,v 1.6 2001/12/09 23:21:07 thorpej Exp $ */
/* /*
* readelf.h * readelf.h
@ -168,6 +168,8 @@ typedef struct {
#define NT_PRPSINFO 3 #define NT_PRPSINFO 3
#define NT_TASKSTRUCT 4 #define NT_TASKSTRUCT 4
#define NT_NETBSD_CORE_PROCINFO 1
/* Note header in a PT_NOTE section */ /* Note header in a PT_NOTE section */
typedef struct elf_note { typedef struct elf_note {
Elf32_Word n_namesz; /* Name size */ Elf32_Word n_namesz; /* Name size */