|
|
|
@ -60,7 +60,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
|
|
|
|
|
|
|
#undef SCNHDR |
|
|
|
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------ */ |
|
|
|
/* Support for core file stuff.. */ |
|
|
|
/* ------------------------------------------------------------------------ */ |
|
|
|
@ -81,7 +80,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
|
|
|
AIX_CORE_DUMPX_CORE is defined (by configure) on AIX 4.3+, and |
|
|
|
CORE_VERSION_1 is defined (by AIX core.h) as 2 on AIX 4.3+ and as 1 on AIX |
|
|
|
4.1 and 4.2. AIX pre-4.1 (aka 3.x) either doesn't define CORE_VERSION_1 |
|
|
|
or else defines it as 0. */ |
|
|
|
or else defines it as 0. */ |
|
|
|
|
|
|
|
#if defined(CORE_VERSION_1) && !CORE_VERSION_1 |
|
|
|
# undef CORE_VERSION_1 |
|
|
|
@ -90,9 +89,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
|
|
|
/* The following union and macros allow this module to compile on all AIX
|
|
|
|
versions and to handle both core_dumpx and core_dump on 4.3+. CNEW_*() |
|
|
|
and COLD_*() macros respectively retrieve core_dumpx and core_dump |
|
|
|
values. */ |
|
|
|
values. */ |
|
|
|
|
|
|
|
/* Union of 32-bit and 64-bit versions of ld_info. */ |
|
|
|
/* Union of 32-bit and 64-bit versions of ld_info. */ |
|
|
|
|
|
|
|
typedef union { |
|
|
|
#ifdef __ld_info32 |
|
|
|
@ -104,7 +103,7 @@ typedef union { |
|
|
|
#endif |
|
|
|
} LdInfo; |
|
|
|
|
|
|
|
/* Union of old and new core dump structures. */ |
|
|
|
/* Union of old and new core dump structures. */ |
|
|
|
|
|
|
|
typedef union { |
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
@ -116,7 +115,7 @@ typedef union { |
|
|
|
4.3+ with appropriate SMIT config */ |
|
|
|
} CoreHdr; |
|
|
|
|
|
|
|
/* Union of old and new vm_info structures. */ |
|
|
|
/* Union of old and new vm_info structures. */ |
|
|
|
|
|
|
|
#ifdef CORE_VERSION_1 |
|
|
|
typedef union { |
|
|
|
@ -129,7 +128,7 @@ typedef union { |
|
|
|
} VmInfo; |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return whether CoreHdr C is in new or old format. */ |
|
|
|
/* Return whether CoreHdr C is in new or old format. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CORE_NEW(c) (!(c).old.c_entries) |
|
|
|
@ -137,7 +136,7 @@ typedef union { |
|
|
|
# define CORE_NEW(c) 0 |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the c_stackorg field from struct core_dumpx C. */ |
|
|
|
/* Return the c_stackorg field from struct core_dumpx C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_STACKORG(c) (c).c_stackorg |
|
|
|
@ -145,7 +144,7 @@ typedef union { |
|
|
|
# define CNEW_STACKORG(c) 0 |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the offset to the loader region from struct core_dump C. */ |
|
|
|
/* Return the offset to the loader region from struct core_dump C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_LOADER(c) (c).c_loader |
|
|
|
@ -153,11 +152,11 @@ typedef union { |
|
|
|
# define CNEW_LOADER(c) 0 |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the offset to the loader region from struct core_dump C. */ |
|
|
|
/* Return the offset to the loader region from struct core_dump C. */ |
|
|
|
|
|
|
|
#define COLD_LOADER(c) (c).c_tab |
|
|
|
|
|
|
|
/* Return the c_lsize field from struct core_dumpx C. */ |
|
|
|
/* Return the c_lsize field from struct core_dumpx C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_LSIZE(c) (c).c_lsize |
|
|
|
@ -165,7 +164,7 @@ typedef union { |
|
|
|
# define CNEW_LSIZE(c) 0 |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the c_dataorg field from struct core_dumpx C. */ |
|
|
|
/* Return the c_dataorg field from struct core_dumpx C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_DATAORG(c) (c).c_dataorg |
|
|
|
@ -173,7 +172,7 @@ typedef union { |
|
|
|
# define CNEW_DATAORG(c) 0 |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the c_datasize field from struct core_dumpx C. */ |
|
|
|
/* Return the c_datasize field from struct core_dumpx C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_DATASIZE(c) (c).c_datasize |
|
|
|
@ -181,7 +180,7 @@ typedef union { |
|
|
|
# define CNEW_DATASIZE(c) 0 |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the c_impl field from struct core_dumpx C. */ |
|
|
|
/* Return the c_impl field from struct core_dumpx C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_IMPL(c) (c).c_impl |
|
|
|
@ -189,7 +188,7 @@ typedef union { |
|
|
|
# define CNEW_IMPL(c) 0 |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the command string from struct core_dumpx C. */ |
|
|
|
/* Return the command string from struct core_dumpx C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_COMM(c) (c).c_u.U_proc.pi_comm |
|
|
|
@ -197,7 +196,7 @@ typedef union { |
|
|
|
# define CNEW_COMM(c) 0 |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the command string from struct core_dump C. */ |
|
|
|
/* Return the command string from struct core_dump C. */ |
|
|
|
|
|
|
|
#ifdef CORE_VERSION_1 |
|
|
|
# define COLD_COMM(c) (c).c_u.U_comm |
|
|
|
@ -205,7 +204,7 @@ typedef union { |
|
|
|
# define COLD_COMM(c) (c).c_u.u_comm |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the struct __context64 pointer from struct core_dumpx C. */ |
|
|
|
/* Return the struct __context64 pointer from struct core_dumpx C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_CONTEXT64(c) (c).c_flt.hctx.r64 |
|
|
|
@ -213,7 +212,7 @@ typedef union { |
|
|
|
# define CNEW_CONTEXT64(c) c |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the struct mstsave pointer from struct core_dumpx C. */ |
|
|
|
/* Return the struct mstsave pointer from struct core_dumpx C. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_MSTSAVE(c) (c).c_flt.hctx.r32 |
|
|
|
@ -221,7 +220,7 @@ typedef union { |
|
|
|
# define CNEW_MSTSAVE(c) c |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return the struct mstsave pointer from struct core_dump C. */ |
|
|
|
/* Return the struct mstsave pointer from struct core_dump C. */ |
|
|
|
|
|
|
|
#ifdef CORE_VERSION_1 |
|
|
|
# define COLD_MSTSAVE(c) (c).c_mst |
|
|
|
@ -229,7 +228,7 @@ typedef union { |
|
|
|
# define COLD_MSTSAVE(c) (c).c_u.u_save |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Return whether struct core_dumpx is from a 64-bit process. */ |
|
|
|
/* Return whether struct core_dumpx is from a 64-bit process. */ |
|
|
|
|
|
|
|
#ifdef AIX_CORE_DUMPX_CORE |
|
|
|
# define CNEW_PROC64(c) IS_PROC64(&(c).c_u.U_proc) |
|
|
|
@ -238,7 +237,7 @@ typedef union { |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Magic end-of-stack addresses for old core dumps. This is _very_ fragile,
|
|
|
|
but I don't see any easy way to get that info right now. */ |
|
|
|
but I don't see any easy way to get that info right now. */ |
|
|
|
|
|
|
|
#ifdef CORE_VERSION_1 |
|
|
|
# define COLD_STACKEND 0x2ff23000 |
|
|
|
@ -247,12 +246,12 @@ typedef union { |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Size of the leading portion that old and new core dump structures have in
|
|
|
|
common. */ |
|
|
|
common. */ |
|
|
|
#define CORE_COMMONSZ ((int)&((struct core_dump *)0)->c_entries + \ |
|
|
|
sizeof (((struct core_dump *)0)->c_entries)) |
|
|
|
|
|
|
|
/* Try to read into CORE the header from the core file associated with ABFD.
|
|
|
|
Return success. */ |
|
|
|
/* Try to read into CORE the header from the core file associated with ABFD.
|
|
|
|
Return success. */ |
|
|
|
|
|
|
|
static boolean |
|
|
|
read_hdr (bfd *abfd, CoreHdr *core) |
|
|
|
@ -263,11 +262,11 @@ read_hdr (bfd *abfd, CoreHdr *core) |
|
|
|
return false; |
|
|
|
|
|
|
|
/* Read the leading portion that old and new core dump structures have in
|
|
|
|
common. */ |
|
|
|
common. */ |
|
|
|
if (bfd_read (core, CORE_COMMONSZ, 1, abfd) != CORE_COMMONSZ) |
|
|
|
return false; |
|
|
|
|
|
|
|
/* Read the trailing portion of the structure. */ |
|
|
|
/* Read the trailing portion of the structure. */ |
|
|
|
size = CORE_NEW (*core) ? sizeof (core->new) : sizeof (core->old) |
|
|
|
- CORE_COMMONSZ; |
|
|
|
return bfd_read ((char *)core + CORE_COMMONSZ, size, 1, abfd) == size; |
|
|
|
@ -298,7 +297,7 @@ make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos) |
|
|
|
} |
|
|
|
|
|
|
|
/* Decide if a given bfd represents a `core' file or not. There really is no
|
|
|
|
magic number or anything like, in rs6000coff. */ |
|
|
|
magic number or anything like, in rs6000coff. */ |
|
|
|
|
|
|
|
const bfd_target * |
|
|
|
rs6000coff_core_p (abfd) |
|
|
|
@ -309,7 +308,7 @@ rs6000coff_core_p (abfd) |
|
|
|
bfd_size_type size; |
|
|
|
char *tmpptr; |
|
|
|
|
|
|
|
/* Values from new and old core structures. */ |
|
|
|
/* Values from new and old core structures. */ |
|
|
|
int c_flag; |
|
|
|
file_ptr c_stack, c_regoff, c_loader; |
|
|
|
bfd_size_type c_size, c_regsize, c_lsize; |
|
|
|
@ -324,7 +323,7 @@ rs6000coff_core_p (abfd) |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
/* Copy fields from new or old core structure. */ |
|
|
|
/* Copy fields from new or old core structure. */ |
|
|
|
if (CORE_NEW (core)) |
|
|
|
{ |
|
|
|
c_flag = core.new.c_flag; |
|
|
|
@ -401,7 +400,7 @@ rs6000coff_core_p (abfd) |
|
|
|
additional shared library sections in a full core. */ |
|
|
|
if (!(c_flag & (FULL_CORE | CORE_TRUNC))) |
|
|
|
{ |
|
|
|
/* If the size is wrong, it means we're misinterpreting something. */ |
|
|
|
/* If the size is wrong, it means we're misinterpreting something. */ |
|
|
|
if (c_stack + (file_ptr) c_size != statbuf.st_size) |
|
|
|
{ |
|
|
|
bfd_set_error (bfd_error_wrong_format); |
|
|
|
@ -433,7 +432,7 @@ rs6000coff_core_p (abfd) |
|
|
|
memcpy (tmpptr, &core, size); |
|
|
|
set_tdata (abfd, tmpptr); |
|
|
|
|
|
|
|
/* Set architecture. */ |
|
|
|
/* Set architecture. */ |
|
|
|
if (CORE_NEW (core)) |
|
|
|
{ |
|
|
|
enum bfd_architecture arch; |
|
|
|
@ -455,13 +454,13 @@ rs6000coff_core_p (abfd) |
|
|
|
bfd_default_set_arch_mach (abfd, arch, mach); |
|
|
|
} |
|
|
|
|
|
|
|
/* .stack section. */ |
|
|
|
/* .stack section. */ |
|
|
|
if (!make_bfd_asection (abfd, ".stack", |
|
|
|
SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS, |
|
|
|
c_size, c_stackend - c_size, c_stack)) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
/* .reg section for all registers. */ |
|
|
|
/* .reg section for all registers. */ |
|
|
|
if (!make_bfd_asection (abfd, ".reg", |
|
|
|
SEC_HAS_CONTENTS, |
|
|
|
c_regsize, (bfd_vma) 0, c_regoff)) |
|
|
|
@ -506,7 +505,7 @@ rs6000coff_core_p (abfd) |
|
|
|
uint ldi_next; |
|
|
|
bfd_vma ldi_dataorg; |
|
|
|
|
|
|
|
/* Fields from new and old core structures. */ |
|
|
|
/* Fields from new and old core structures. */ |
|
|
|
bfd_size_type c_datasize, c_vmregions; |
|
|
|
file_ptr c_data, c_vmm; |
|
|
|
|
|
|
|
@ -538,9 +537,9 @@ rs6000coff_core_p (abfd) |
|
|
|
|
|
|
|
/* .data sections from loaded objects. */ |
|
|
|
if (proc64) |
|
|
|
size = (int)((LdInfo *)0)->l64.ldinfo_filename; |
|
|
|
size = (int) ((LdInfo *)0)->l64.ldinfo_filename; |
|
|
|
else |
|
|
|
size = (int)((LdInfo *)0)->l32.ldinfo_filename; |
|
|
|
size = (int) ((LdInfo *)0)->l32.ldinfo_filename; |
|
|
|
|
|
|
|
while (1) |
|
|
|
{ |
|
|
|
@ -560,7 +559,7 @@ rs6000coff_core_p (abfd) |
|
|
|
{ |
|
|
|
ldi_core = ldinfo.l32.ldinfo_core; |
|
|
|
ldi_datasize = ldinfo.l32.ldinfo_datasize; |
|
|
|
ldi_dataorg = (bfd_vma)(long) ldinfo.l32.ldinfo_dataorg; |
|
|
|
ldi_dataorg = (bfd_vma) (long) ldinfo.l32.ldinfo_dataorg; |
|
|
|
ldi_next = ldinfo.l32.ldinfo_next; |
|
|
|
} |
|
|
|
|
|
|
|
@ -602,7 +601,7 @@ rs6000coff_core_p (abfd) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
vminfo_addr = (bfd_vma)(long) vminfo.old.vminfo_addr; |
|
|
|
vminfo_addr = (bfd_vma) (long) vminfo.old.vminfo_addr; |
|
|
|
vminfo_size = vminfo.old.vminfo_size; |
|
|
|
vminfo_offset = vminfo.old.vminfo_offset; |
|
|
|
} |
|
|
|
@ -618,12 +617,10 @@ rs6000coff_core_p (abfd) |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
return abfd->xvec; /* this is garbage for now. */ |
|
|
|
return abfd->xvec; /* this is garbage for now. */ |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* return `true' if given core is from the given executable.. */ |
|
|
|
/* return `true' if given core is from the given executable.. */ |
|
|
|
boolean |
|
|
|
rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd) |
|
|
|
bfd *core_bfd; |
|
|
|
@ -646,9 +643,9 @@ rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd) |
|
|
|
c_loader = (file_ptr) COLD_LOADER (core.old); |
|
|
|
|
|
|
|
if (CORE_NEW (core) && CNEW_PROC64 (core.new)) |
|
|
|
size = (int)((LdInfo *)0)->l64.ldinfo_filename; |
|
|
|
size = (int) ((LdInfo *)0)->l64.ldinfo_filename; |
|
|
|
else |
|
|
|
size = (int)((LdInfo *)0)->l32.ldinfo_filename; |
|
|
|
size = (int) ((LdInfo *)0)->l32.ldinfo_filename; |
|
|
|
|
|
|
|
if (bfd_seek (core_bfd, c_loader + size, SEEK_SET) != 0) |
|
|
|
return false; |
|
|
|
|