Add support for 64bit NETBSD cores

This commit is contained in:
Nick Clifton 2004-02-23 15:25:20 +00:00
parent 1b49374200
commit aca305d96d
3 changed files with 170 additions and 130 deletions

View File

@ -1,3 +1,11 @@
2004-02-23 Mark Kettenis <kettenis@gnu.org>
* libaout.h (enum machine_type): Add M_SPARC64_NETBSD and
M_X86_64_NETBSD.
* netbsd-core.c (M_SPARC64_OPENBSD): Define.
(netbsd_core_file_p): Set architecture from machine ID for
selected machines.
2004-02-23 Jakub Jelinek <jakub@redhat.com>
* elflink.h (size_dynamic_sections): If not adding DT_FLAGS and

View File

@ -1,6 +1,6 @@
/* BFD back-end data structures for a.out (and similar) files.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2003
2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
Written by Cygnus Support.
@ -249,71 +249,72 @@ struct aout_backend_data
struct internal_exec
{
long a_info; /* Magic number and flags, packed */
bfd_vma a_text; /* length of text, in bytes */
bfd_vma a_data; /* length of data, in bytes */
bfd_vma a_bss; /* length of uninitialized data area in mem */
bfd_vma a_syms; /* length of symbol table data in file */
bfd_vma a_entry; /* start address */
bfd_vma a_trsize; /* length of text's relocation info, in bytes */
bfd_vma a_drsize; /* length of data's relocation info, in bytes */
long a_info; /* Magic number and flags, packed. */
bfd_vma a_text; /* Length of text, in bytes. */
bfd_vma a_data; /* Length of data, in bytes. */
bfd_vma a_bss; /* Length of uninitialized data area in mem. */
bfd_vma a_syms; /* Length of symbol table data in file. */
bfd_vma a_entry; /* Start address. */
bfd_vma a_trsize; /* Length of text's relocation info, in bytes. */
bfd_vma a_drsize; /* Length of data's relocation info, in bytes. */
/* Added for i960 */
bfd_vma a_tload; /* Text runtime load address */
bfd_vma a_dload; /* Data runtime load address */
unsigned char a_talign; /* Alignment of text segment */
unsigned char a_dalign; /* Alignment of data segment */
unsigned char a_balign; /* Alignment of bss segment */
char a_relaxable; /* Enough info for linker relax */
bfd_vma a_tload; /* Text runtime load address. */
bfd_vma a_dload; /* Data runtime load address. */
unsigned char a_talign; /* Alignment of text segment. */
unsigned char a_dalign; /* Alignment of data segment. */
unsigned char a_balign; /* Alignment of bss segment. */
char a_relaxable; /* Enough info for linker relax. */
};
/* Magic number is written
< MSB >
3130292827262524232221201918171615141312111009080706050403020100
< FLAGS >< MACHINE TYPE >< MAGIC NUMBER >
*/
< FLAGS >< MACHINE TYPE >< MAGIC NUMBER > */
/* Magic number for NetBSD is
<MSB >
3130292827262524232221201918171615141312111009080706050403020100
< FLAGS >< MACHINE TYPE >< MAGIC NUMBER >
*/
< FLAGS >< MACHINE TYPE >< MAGIC NUMBER > */
enum machine_type {
enum machine_type
{
M_UNKNOWN = 0,
M_68010 = 1,
M_68020 = 2,
M_SPARC = 3,
/* Skip a bunch so we don't run into any of SUN's numbers. */
/* Make these up for the ns32k. */
M_NS32032 = (64), /* ns32032 running ? */
M_NS32532 = (64 + 5), /* ns32532 running mach */
M_NS32032 = (64), /* NS32032 running ? */
M_NS32532 = (64 + 5), /* NS32532 running mach. */
M_386 = 100,
M_29K = 101, /* AMD 29000 */
M_386_DYNIX = 102, /* Sequent running dynix */
M_ARM = 103, /* Advanced Risc Machines ARM */
M_SPARCLET = 131, /* SPARClet = M_SPARC + 128 */
M_386_NETBSD = 134, /* NetBSD/i386 binary */
M_68K_NETBSD = 135, /* NetBSD/m68k binary */
M_68K4K_NETBSD = 136, /* NetBSD/m68k4k binary */
M_532_NETBSD = 137, /* NetBSD/ns32k binary */
M_SPARC_NETBSD = 138, /* NetBSD/sparc binary */
M_PMAX_NETBSD = 139, /* NetBSD/pmax (MIPS little-endian) binary */
M_VAX_NETBSD = 140, /* NetBSD/vax binary */
M_ALPHA_NETBSD = 141, /* NetBSD/alpha binary */
M_ARM6_NETBSD = 143, /* NetBSD/arm32 binary */
M_SPARCLET_1 = 147, /* 0x93, reserved */
M_VAX4K_NETBSD = 150, /* NetBSD/vax 4K pages binary */
M_MIPS1 = 151, /* MIPS R2000/R3000 binary */
M_MIPS2 = 152, /* MIPS R4000/R6000 binary */
M_SPARCLET_2 = 163, /* 0xa3, reserved */
M_SPARCLET_3 = 179, /* 0xb3, reserved */
M_SPARCLET_4 = 195, /* 0xc3, reserved */
M_HP200 = 200, /* HP 200 (68010) BSD binary */
M_HP300 = (300 % 256), /* HP 300 (68020+68881) BSD binary */
M_HPUX = (0x20c % 256), /* HP 200/300 HPUX binary */
M_SPARCLET_5 = 211, /* 0xd3, reserved */
M_SPARCLET_6 = 227, /* 0xe3, reserved */
/* M_SPARCLET_7 = 243 / * 0xf3, reserved */
M_29K = 101, /* AMD 29000. */
M_386_DYNIX = 102, /* Sequent running dynix. */
M_ARM = 103, /* Advanced Risc Machines ARM. */
M_SPARCLET = 131, /* SPARClet = M_SPARC + 128. */
M_386_NETBSD = 134, /* NetBSD/i386 binary. */
M_68K_NETBSD = 135, /* NetBSD/m68k binary. */
M_68K4K_NETBSD = 136, /* NetBSD/m68k4k binary. */
M_532_NETBSD = 137, /* NetBSD/ns32k binary. */
M_SPARC_NETBSD = 138, /* NetBSD/sparc binary. */
M_PMAX_NETBSD = 139, /* NetBSD/pmax (MIPS little-endian) binary. */
M_VAX_NETBSD = 140, /* NetBSD/vax binary. */
M_ALPHA_NETBSD = 141, /* NetBSD/alpha binary. */
M_ARM6_NETBSD = 143, /* NetBSD/arm32 binary. */
M_SPARCLET_1 = 147, /* 0x93, reserved. */
M_VAX4K_NETBSD = 150, /* NetBSD/vax 4K pages binary. */
M_MIPS1 = 151, /* MIPS R2000/R3000 binary. */
M_MIPS2 = 152, /* MIPS R4000/R6000 binary. */
M_SPARC64_NETBSD = 156, /* NetBSD/sparc64 binary. */
M_X86_64_NETBSD = 157, /* NetBSD/amd64 binary. */
M_SPARCLET_2 = 163, /* 0xa3, reserved. */
M_SPARCLET_3 = 179, /* 0xb3, reserved. */
M_SPARCLET_4 = 195, /* 0xc3, reserved. */
M_HP200 = 200, /* HP 200 (68010) BSD binary. */
M_HP300 = (300 % 256), /* HP 300 (68020+68881) BSD binary. */
M_HPUX = (0x20c % 256), /* HP 200/300 HPUX binary. */
M_SPARCLET_5 = 211, /* 0xd3, reserved. */
M_SPARCLET_6 = 227, /* 0xe3, reserved. */
/*M_SPARCLET_7 = 243 / * 0xf3, reserved. */
M_SPARCLITE_LE = 243,
M_CRIS = 255 /* Axis CRIS binary. */
};
@ -362,7 +363,8 @@ enum machine_type {
((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24))
#endif
typedef struct aout_symbol {
typedef struct aout_symbol
{
asymbol symbol;
short desc;
char other;
@ -373,9 +375,10 @@ typedef struct aout_symbol {
Various things depend on this struct being around any time an a.out
file is being handled. An example is dbxread.c in GDB. */
struct aoutdata {
struct internal_exec *hdr; /* exec file header */
aout_symbol_type *symbols; /* symtab for input bfd */
struct aoutdata
{
struct internal_exec *hdr; /* Exec file header. */
aout_symbol_type *symbols; /* Symtab for input bfd. */
/* For ease, we do this. */
asection *textsec;
@ -445,7 +448,8 @@ struct aoutdata {
bfd_vma *local_got_offsets;
};
struct aout_data_struct {
struct aout_data_struct
{
struct aoutdata a;
struct internal_exec e;
};
@ -630,7 +634,7 @@ extern bfd_boolean NAME(aout,bfd_free_cached_info)
#ifndef WRITE_HEADERS
#define WRITE_HEADERS(abfd, execp) \
{ \
bfd_size_type text_size; /* dummy vars */ \
bfd_size_type text_size; /* Dummy vars. */ \
file_ptr text_end; \
if (adata(abfd).magic == undecided_magic) \
NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end); \

View File

@ -1,6 +1,6 @@
/* BFD back end for NetBSD style core files
Copyright 1988, 1989, 1991, 1992, 1993, 1996, 1998, 1999, 2000, 2001,
2002
2002, 2004
Free Software Foundation, Inc.
Written by Paul Kranenburg, EUR
@ -23,22 +23,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "libaout.h" /* BFD a.out internal data structures */
#include "libaout.h" /* BFD a.out internal data structures. */
#include <sys/param.h>
#include <sys/dir.h>
#include <signal.h>
#include <sys/core.h>
/*
* FIXME: On NetBSD/sparc CORE_FPU_OFFSET should be (sizeof (struct trapframe))
*/
/* The machine ID for OpenBSD/sparc64 and older versions of
NetBSD/sparc64 overlaps with M_MIPS1. */
#define M_SPARC64_OPENBSD M_MIPS1
struct netbsd_core_struct {
/* FIXME: On NetBSD/sparc CORE_FPU_OFFSET should be (sizeof (struct trapframe)). */
struct netbsd_core_struct
{
struct core core;
} *rawptr;
/* forward declarations */
/* Forward declarations. */
static const bfd_target *netbsd_core_file_p
PARAMS ((bfd *abfd));
@ -68,7 +71,7 @@ netbsd_core_file_p (abfd)
val = bfd_bread ((void *) &core, amt, abfd);
if (val != sizeof core)
{
/* Too small to be a core file */
/* Too small to be a core file. */
bfd_set_error (bfd_error_wrong_format);
return 0;
}
@ -160,6 +163,27 @@ netbsd_core_file_p (abfd)
#endif
}
/* Set architecture from machine ID. */
switch (CORE_GETMID (core))
{
case M_X86_64_NETBSD:
bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
break;
case M_386_NETBSD:
bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386);
break;
case M_SPARC_NETBSD:
bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
break;
case M_SPARC64_NETBSD:
case M_SPARC64_OPENBSD:
bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
break;
}
/* OK, we believe you. You're a core file (sure, sure). */
return abfd->xvec;
@ -191,15 +215,19 @@ netbsd_core_file_matches_executable_p (core_bfd, exec_bfd)
bfd *core_bfd ATTRIBUTE_UNUSED;
bfd *exec_bfd ATTRIBUTE_UNUSED;
{
return TRUE; /* FIXME, We have no way of telling at this point */
/* FIXME, We have no way of telling at this point. */
return TRUE;
}
/* If somebody calls any byte-swapping routines, shoot them. */
static void
swap_abort ()
{
abort (); /* This way doesn't require any declaration for ANSI to fuck up */
/* This way doesn't require any declaration for ANSI to fuck up. */
abort ();
}
#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort )
#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort )
#define NO_SIGNED_GET \
@ -209,33 +237,33 @@ const bfd_target netbsd_core_vec =
{
"netbsd-core",
bfd_target_unknown_flavour,
BFD_ENDIAN_UNKNOWN, /* target byte order */
BFD_ENDIAN_UNKNOWN, /* target headers byte order */
(HAS_RELOC | EXEC_P | /* object flags */
BFD_ENDIAN_UNKNOWN, /* Target byte order. */
BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
(HAS_RELOC | EXEC_P | /* Object flags. */
HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
0, /* symbol prefix */
' ', /* ar_pad_char */
16, /* ar_max_namelen */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
0, /* Symbol prefix. */
' ', /* ar_pad_char. */
16, /* ar_max_namelen. */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data. */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data. */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data. */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs. */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs. */
NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs. */
{ /* bfd_check_format */
_bfd_dummy_target, /* unknown format */
_bfd_dummy_target, /* object file */
_bfd_dummy_target, /* archive */
netbsd_core_file_p /* a core file */
{ /* bfd_check_format. */
_bfd_dummy_target, /* Unknown format. */
_bfd_dummy_target, /* Object file. */
_bfd_dummy_target, /* Archive. */
netbsd_core_file_p /* A core file. */
},
{ /* bfd_set_format */
{ /* bfd_set_format. */
bfd_false, bfd_false,
bfd_false, bfd_false
},
{ /* bfd_write_contents */
{ /* bfd_write_contents. */
bfd_false, bfd_false,
bfd_false, bfd_false
},
@ -252,5 +280,5 @@ const bfd_target netbsd_core_vec =
NULL,
(PTR) 0 /* backend_data */
(PTR) 0 /* Backend_data. */
};