mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 02:24:46 +08:00
Add support for 32-bit and 64-bit PowerPC AIX core files.
* configure.ac (powerpc64-*-aix[5-9].*): Match powerpc64 running aix for core file support. * configure: Regenerate. * rs6000-core.c: Check for __ld_info64 if compiling 64-bit gdb. Added BFD64 check if we are using old core file format for 32-bit gdb. Set sizeof CORE_COMMONSZ appropriately in case of either new or old core file format. (read_hdr): Added BFD64 check for 64-bit support. (rs6000coff_core_p): Likewise. (rs6000coff_core_file_matches_executable_p): Likewise. (rs6000coff_core_file_failing_command): Likewise. (rs6000coff_core_file_failing_signal): Likewise. Add support for debugging core files generated by binaries in Large Memory model. (rs6000coff_core_p): If Large Memory Model is used, then the .data segment should start from BDATAORG which has been defined in the system header files.
This commit is contained in:
parent
ef8e6722f2
commit
d6867a7559
@ -1,3 +1,23 @@
|
||||
2015-10-27 Sangamesh Mallayya <nickc@redhat.com>sangamesh.swamy@in.ibm.com>
|
||||
|
||||
* configure.ac (powerpc64-*-aix[5-9].*): Match powerpc64 running
|
||||
aix for core file support.
|
||||
* configure: Regenerate.
|
||||
* rs6000-core.c: Check for __ld_info64 if compiling 64-bit gdb.
|
||||
Added BFD64 check if we are using old core file format for 32-bit gdb.
|
||||
Set sizeof CORE_COMMONSZ appropriately in case of either new or
|
||||
old core file format.
|
||||
(read_hdr): Added BFD64 check for 64-bit support.
|
||||
(rs6000coff_core_p): Likewise.
|
||||
(rs6000coff_core_file_matches_executable_p): Likewise.
|
||||
(rs6000coff_core_file_failing_command): Likewise.
|
||||
(rs6000coff_core_file_failing_signal): Likewise.
|
||||
Add support for debugging core files generated by binaries in
|
||||
Large Memory model.
|
||||
(rs6000coff_core_p): If Large Memory Model is used, then the .data
|
||||
segment should start from BDATAORG which has been defined in the
|
||||
system header files.
|
||||
|
||||
2015-10-26 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/19175
|
||||
|
3
bfd/configure
vendored
3
bfd/configure
vendored
@ -14056,7 +14056,7 @@ if test "${target}" = "${host}"; then
|
||||
rs6000-*-lynx*)
|
||||
COREFILE=lynx-core.lo
|
||||
;;
|
||||
rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].*)
|
||||
rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].* | powerpc64-*-aix[5-9].*)
|
||||
COREFILE=rs6000-core.lo
|
||||
COREFLAG="$COREFLAG -DAIX_5_CORE -DAIX_CORE_DUMPX_CORE"
|
||||
;;
|
||||
@ -14092,6 +14092,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||
;;
|
||||
rs6000-*-aix4*) COREFILE=rs6000-core.lo ;;
|
||||
rs6000-*-*) COREFILE=rs6000-core.lo ;;
|
||||
powerpc64-*-aix*) COREFILE=rs6000-core.lo ;;
|
||||
powerpc-*-aix4*) COREFILE=rs6000-core.lo ;;
|
||||
powerpc-*-aix*) COREFILE=rs6000-core.lo ;;
|
||||
powerpc-*-beos*) ;;
|
||||
|
@ -428,7 +428,7 @@ changequote([,])dnl
|
||||
COREFILE=lynx-core.lo
|
||||
;;
|
||||
changequote(,)dnl
|
||||
rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].*)
|
||||
rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].* | powerpc64-*-aix[5-9].*)
|
||||
changequote([,])dnl
|
||||
COREFILE=rs6000-core.lo
|
||||
COREFLAG="$COREFLAG -DAIX_5_CORE -DAIX_CORE_DUMPX_CORE"
|
||||
@ -447,6 +447,7 @@ changequote([,])dnl
|
||||
;;
|
||||
rs6000-*-aix4*) COREFILE=rs6000-core.lo ;;
|
||||
rs6000-*-*) COREFILE=rs6000-core.lo ;;
|
||||
powerpc64-*-aix*) COREFILE=rs6000-core.lo ;;
|
||||
powerpc-*-aix4*) COREFILE=rs6000-core.lo ;;
|
||||
powerpc-*-aix*) COREFILE=rs6000-core.lo ;;
|
||||
powerpc-*-beos*) ;;
|
||||
|
@ -55,9 +55,7 @@
|
||||
|
||||
#undef SCNHDR
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* Support for core file stuff.. */
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* Support for core file stuff. */
|
||||
|
||||
#include <sys/user.h>
|
||||
#define __LDINFO_PTRACE32__ /* for __ld_info32 */
|
||||
@ -91,8 +89,9 @@ typedef unsigned long ptr_to_uint;
|
||||
|
||||
/* Union of 32-bit and 64-bit versions of ld_info. */
|
||||
|
||||
typedef union {
|
||||
#ifdef __ld_info32
|
||||
typedef union
|
||||
{
|
||||
#if defined (__ld_info32) || defined (__ld_info64)
|
||||
struct __ld_info32 l32;
|
||||
struct __ld_info64 l64;
|
||||
#else
|
||||
@ -103,33 +102,43 @@ typedef union {
|
||||
|
||||
/* Union of old and new core dump structures. */
|
||||
|
||||
typedef union {
|
||||
typedef union
|
||||
{
|
||||
#ifdef AIX_CORE_DUMPX_CORE
|
||||
struct core_dumpx new_dump; /* new AIX 4.3+ core dump */
|
||||
struct core_dumpx new_dump; /* New AIX 4.3+ core dump. */
|
||||
#else
|
||||
struct core_dump new_dump; /* for simpler coding */
|
||||
struct core_dump new_dump; /* For simpler coding. */
|
||||
#endif
|
||||
#ifndef BFD64 /* Use old only if gdb is 32-bit. */
|
||||
struct core_dump old; /* Old AIX 4.2- core dump, still used on
|
||||
4.3+ with appropriate SMIT config. */
|
||||
#endif
|
||||
struct core_dump old; /* old AIX 4.2- core dump, still used on
|
||||
4.3+ with appropriate SMIT config */
|
||||
} CoreHdr;
|
||||
|
||||
/* Union of old and new vm_info structures. */
|
||||
|
||||
#ifdef CORE_VERSION_1
|
||||
typedef union {
|
||||
typedef union
|
||||
{
|
||||
#ifdef AIX_CORE_DUMPX_CORE
|
||||
struct vm_infox new_dump;
|
||||
#else
|
||||
struct vm_info new_dump;
|
||||
#endif
|
||||
#ifndef BFD64
|
||||
struct vm_info old;
|
||||
#endif
|
||||
} VmInfo;
|
||||
#endif
|
||||
|
||||
/* Return whether CoreHdr C is in new or old format. */
|
||||
|
||||
#ifdef AIX_CORE_DUMPX_CORE
|
||||
# define CORE_NEW(c) (!(c).old.c_entries)
|
||||
# ifndef BFD64
|
||||
# define CORE_NEW(c) (!(c).old.c_entries)
|
||||
# else
|
||||
# define CORE_NEW(c) (!(c).new_dump.c_entries)
|
||||
# endif
|
||||
#else
|
||||
# define CORE_NEW(c) 0
|
||||
#endif
|
||||
@ -258,9 +267,13 @@ typedef union {
|
||||
|
||||
/* Size of the leading portion that old and new core dump structures have in
|
||||
common. */
|
||||
#define CORE_COMMONSZ ((int) &((struct core_dump *) 0)->c_entries \
|
||||
+ sizeof (((struct core_dump *) 0)->c_entries))
|
||||
|
||||
#ifdef AIX_CORE_DUMPX_CORE
|
||||
#define CORE_COMMONSZ ((long) &((struct core_dumpx *) 0)->c_entries \
|
||||
+ sizeof (((struct core_dumpx *) 0)->c_entries))
|
||||
#else
|
||||
#define CORE_COMMONSZ ((int) &((struct core_dump *) 0)->c_entries \
|
||||
+ sizeof (((struct core_dump *) 0)->c_entries)
|
||||
#endif
|
||||
/* Define prototypes for certain functions, to avoid a compiler warning
|
||||
saying that they are missing. */
|
||||
|
||||
@ -290,8 +303,10 @@ read_hdr (bfd *abfd, CoreHdr *core)
|
||||
/* Read the trailing portion of the structure. */
|
||||
if (CORE_NEW (*core))
|
||||
size = sizeof (core->new_dump);
|
||||
#ifndef BFD64
|
||||
else
|
||||
size = sizeof (core->old);
|
||||
#endif
|
||||
size -= CORE_COMMONSZ;
|
||||
return bfd_bread ((char *) core + CORE_COMMONSZ, size, abfd) == size;
|
||||
}
|
||||
@ -356,6 +371,7 @@ rs6000coff_core_p (bfd *abfd)
|
||||
c_stackend = CNEW_STACKORG (core.new_dump) + c_size;
|
||||
c_lsize = CNEW_LSIZE (core.new_dump);
|
||||
c_loader = CNEW_LOADER (core.new_dump);
|
||||
#ifndef BFD64
|
||||
proc64 = CNEW_PROC64 (core.new_dump);
|
||||
}
|
||||
else
|
||||
@ -366,6 +382,7 @@ rs6000coff_core_p (bfd *abfd)
|
||||
c_stackend = COLD_STACKEND;
|
||||
c_lsize = 0x7ffffff;
|
||||
c_loader = (file_ptr) (ptr_to_uint) COLD_LOADER (core.old);
|
||||
#endif
|
||||
proc64 = 0;
|
||||
}
|
||||
|
||||
@ -379,11 +396,13 @@ rs6000coff_core_p (bfd *abfd)
|
||||
c_regsize = sizeof (CNEW_MSTSAVE (core.new_dump));
|
||||
c_regptr = &CNEW_MSTSAVE (core.new_dump);
|
||||
}
|
||||
#ifndef BFD64
|
||||
else
|
||||
{
|
||||
c_regsize = sizeof (COLD_MSTSAVE (core.old));
|
||||
c_regptr = &COLD_MSTSAVE (core.old);
|
||||
}
|
||||
#endif
|
||||
c_regoff = (char *) c_regptr - (char *) &core;
|
||||
|
||||
if (bfd_stat (abfd, &statbuf) < 0)
|
||||
@ -433,9 +452,15 @@ rs6000coff_core_p (bfd *abfd)
|
||||
}
|
||||
|
||||
/* Sanity check on the c_tab field. */
|
||||
if (!CORE_NEW (core) && (c_loader < (file_ptr) sizeof core.old ||
|
||||
c_loader >= statbuf.st_size ||
|
||||
c_loader >= c_stack))
|
||||
if (!CORE_NEW (core)
|
||||
&& (
|
||||
#ifndef BFD64
|
||||
c_loader < (file_ptr) sizeof core.old
|
||||
#else
|
||||
c_loader < (file_ptr) sizeof core.new_dump
|
||||
#endif
|
||||
|| c_loader >= statbuf.st_size
|
||||
|| c_loader >= c_stack))
|
||||
{
|
||||
bfd_set_error (bfd_error_wrong_format);
|
||||
return NULL;
|
||||
@ -447,7 +472,11 @@ rs6000coff_core_p (bfd *abfd)
|
||||
bfd_get_filename (abfd));
|
||||
|
||||
/* Allocate core file header. */
|
||||
#ifndef BFD64
|
||||
size = CORE_NEW (core) ? sizeof (core.new_dump) : sizeof (core.old);
|
||||
#else
|
||||
size = sizeof (core.new_dump);
|
||||
#endif
|
||||
tmpptr = (char *) bfd_zalloc (abfd, (bfd_size_type) size);
|
||||
if (!tmpptr)
|
||||
return NULL;
|
||||
@ -528,6 +557,7 @@ rs6000coff_core_p (bfd *abfd)
|
||||
file_ptr ldi_core;
|
||||
uint ldi_next;
|
||||
bfd_vma ldi_dataorg;
|
||||
bfd_vma core_dataorg;
|
||||
|
||||
/* Fields from new and old core structures. */
|
||||
bfd_size_type c_datasize, c_vmregions;
|
||||
@ -540,6 +570,7 @@ rs6000coff_core_p (bfd *abfd)
|
||||
c_vmregions = core.new_dump.c_vmregions;
|
||||
c_vmm = (file_ptr) core.new_dump.c_vmm;
|
||||
}
|
||||
#ifndef BFD64
|
||||
else
|
||||
{
|
||||
c_datasize = core.old.c_datasize;
|
||||
@ -547,23 +578,32 @@ rs6000coff_core_p (bfd *abfd)
|
||||
c_vmregions = core.old.c_vmregions;
|
||||
c_vmm = (file_ptr) (ptr_to_uint) core.old.c_vmm;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* .data section from executable. */
|
||||
if (c_datasize)
|
||||
{
|
||||
/* If Large Memory Model is used, then the .data segment should start from
|
||||
BDATAORG which has been defined in the system header files. */
|
||||
|
||||
if (c_flag & CORE_BIGDATA)
|
||||
core_dataorg = BDATAORG;
|
||||
else
|
||||
core_dataorg = CDATA_ADDR (c_datasize);
|
||||
|
||||
if (!make_bfd_asection (abfd, ".data",
|
||||
SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
|
||||
c_datasize,
|
||||
(bfd_vma) CDATA_ADDR (c_datasize),
|
||||
(bfd_vma) core_dataorg,
|
||||
c_data))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* .data sections from loaded objects. */
|
||||
if (proc64)
|
||||
size = (int) ((LdInfo *) 0)->l64.ldinfo_filename;
|
||||
size = (unsigned long) ((LdInfo *) 0)->l64.ldinfo_filename;
|
||||
else
|
||||
size = (int) ((LdInfo *) 0)->l32.ldinfo_filename;
|
||||
size = (unsigned long) ((LdInfo *) 0)->l32.ldinfo_filename;
|
||||
|
||||
while (1)
|
||||
{
|
||||
@ -613,7 +653,11 @@ rs6000coff_core_p (bfd *abfd)
|
||||
file_ptr vminfo_offset;
|
||||
bfd_vma vminfo_addr;
|
||||
|
||||
#ifndef BFD64
|
||||
size = CORE_NEW (core) ? sizeof (vminfo.new_dump) : sizeof (vminfo.old);
|
||||
#else
|
||||
size = sizeof (vminfo.new_dump);
|
||||
#endif
|
||||
if (bfd_bread (&vminfo, size, abfd) != size)
|
||||
goto fail;
|
||||
|
||||
@ -623,12 +667,14 @@ rs6000coff_core_p (bfd *abfd)
|
||||
vminfo_size = vminfo.new_dump.vminfo_size;
|
||||
vminfo_offset = vminfo.new_dump.vminfo_offset;
|
||||
}
|
||||
#ifndef BFD64
|
||||
else
|
||||
{
|
||||
vminfo_addr = (bfd_vma) (ptr_to_uint) vminfo.old.vminfo_addr;
|
||||
vminfo_size = vminfo.old.vminfo_size;
|
||||
vminfo_offset = vminfo.old.vminfo_offset;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (vminfo_offset)
|
||||
if (!make_bfd_asection (abfd, ".vmdata",
|
||||
@ -668,8 +714,10 @@ rs6000coff_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
|
||||
|
||||
if (CORE_NEW (core))
|
||||
c_loader = CNEW_LOADER (core.new_dump);
|
||||
#ifndef BFD64
|
||||
else
|
||||
c_loader = (file_ptr) (ptr_to_uint) COLD_LOADER (core.old);
|
||||
#endif
|
||||
|
||||
if (CORE_NEW (core) && CNEW_PROC64 (core.new_dump))
|
||||
size = (int) ((LdInfo *) 0)->l64.ldinfo_filename;
|
||||
@ -732,8 +780,12 @@ char *
|
||||
rs6000coff_core_file_failing_command (bfd *abfd)
|
||||
{
|
||||
CoreHdr *core = core_hdr (abfd);
|
||||
#ifndef BFD64
|
||||
char *com = CORE_NEW (*core) ?
|
||||
CNEW_COMM (core->new_dump) : COLD_COMM (core->old);
|
||||
#else
|
||||
char *com = CNEW_COMM (core->new_dump);
|
||||
#endif
|
||||
|
||||
if (*com)
|
||||
return com;
|
||||
@ -745,7 +797,11 @@ int
|
||||
rs6000coff_core_file_failing_signal (bfd *abfd)
|
||||
{
|
||||
CoreHdr *core = core_hdr (abfd);
|
||||
#ifndef BFD64
|
||||
return CORE_NEW (*core) ? core->new_dump.c_signo : core->old.c_signo;
|
||||
#else
|
||||
return core->new_dump.c_signo;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* AIX_CORE */
|
||||
|
Loading…
Reference in New Issue
Block a user