Add rudimentry VAX COFF support. enough so objdump, size, nm, etc. are happy

but no near enough for gas or ld.
This commit is contained in:
matt 2000-01-11 05:48:27 +00:00
parent d3ae549f72
commit b9db4a8140
7 changed files with 347 additions and 3 deletions

109
gnu/dist/bfd/coff-vax.c vendored Normal file
View File

@ -0,0 +1,109 @@
/* BFD back-end for VAX COFF files.
Copyright (C) 1992, 93, 94, 95, 1997 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@cs.widener.edu).
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "coff/vax.h"
#include "coff/internal.h"
#include "libcoff.h"
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
static reloc_howto_type howto_table[] =
{
{0},
{1},
{2},
{3},
{4},
{5},
HOWTO(R_DIR32, 0, 2, 32, false, 0,complain_overflow_bitfield, 0, "dir32", true, 0xffffffff,0xffffffff, false),
{7},
{010},
{011},
{012},
{013},
{014},
{015},
{016},
HOWTO(R_RELBYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "8", true, 0x000000ff,0x000000ff, false),
HOWTO(R_RELWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, 0, "16", true, 0x0000ffff,0x0000ffff, false),
HOWTO(R_RELLONG, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "32", true, 0xffffffff,0xffffffff, false),
HOWTO(R_PCRBYTE, 0, 0, 8, true, 0, complain_overflow_signed, 0, "DISP8", true, 0x000000ff,0x000000ff, false),
HOWTO(R_PCRWORD, 0, 1, 16, true, 0, complain_overflow_signed, 0, "DISP16", true, 0x0000ffff,0x0000ffff, false),
HOWTO(R_PCRLONG, 0, 2, 32, true, 0, complain_overflow_signed, 0, "DISP32", true, 0xffffffff,0xffffffff, false),
};
/* Turn a howto into a reloc nunmber */
#define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
#define BADMAG(x) VAXBADMAG(x)
#define VAX 1
#define RTYPE2HOWTO(cache_ptr, dst) \
(cache_ptr)->howto = howto_table + (dst)->r_type;
#include "coffcode.h"
#define coff_write_armap bsd_write_armap
const bfd_target vaxcoff_vec =
{
"coff-vax", /* name */
bfd_target_coff_flavour,
BFD_ENDIAN_LITTLE, /* data byte order is big */
BFD_ENDIAN_BIG, /* header byte order is big */
(HAS_RELOC | EXEC_P | /* object flags */
HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | WP_TEXT),
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
0, /* leading underscore */
'/', /* ar_pad_char */
15, /* ar_max_namelen */
bfd_getl64, bfd_getl_signed_64, bfd_putl64,
bfd_getl32, bfd_getl_signed_32, bfd_putl32,
bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
bfd_getl64, bfd_getl_signed_64, bfd_putl64,
bfd_getl32, bfd_getl_signed_32, bfd_putl32,
bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
{_bfd_dummy_target, coff_object_p, /* bfd_check_format */
bfd_generic_archive_p, _bfd_dummy_target},
{bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
bfd_false},
{bfd_false, coff_write_object_contents, /* bfd_write_contents */
_bfd_write_archive_contents, bfd_false},
BFD_JUMP_TABLE_GENERIC (coff),
BFD_JUMP_TABLE_COPY (coff),
BFD_JUMP_TABLE_CORE (_bfd_nocore),
BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
BFD_JUMP_TABLE_SYMBOLS (coff),
BFD_JUMP_TABLE_RELOCS (coff),
BFD_JUMP_TABLE_WRITE (coff),
BFD_JUMP_TABLE_LINK (coff),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
COFF_SWAP_TABLE,
};

View File

@ -1554,6 +1554,14 @@ coff_set_arch_mach_hook (abfd, filehdr)
break;
#endif
#ifdef VAXROMAGIC
case VAXRWMAGIC:
case VAXROMAGIC:
arch = bfd_arch_vax;
machine = 0;
break;
#endif
#ifdef WE32KMAGIC
case WE32KMAGIC:
arch = bfd_arch_we32k;
@ -2126,6 +2134,13 @@ coff_set_flags (abfd, magicp, flagsp)
break;
#endif
#ifdef VAXRWMAGIC
case bfd_arch_vax:
*magicp = (bfd_get_file_flags(abfd) & WP_TEXT) ? VAXROMAGIC : VAXRWMAGIC;
return true;
break;
#endif
#ifdef WE32KMAGIC
case bfd_arch_we32k:
*magicp = WE32KMAGIC;
@ -2957,6 +2972,13 @@ coff_write_object_contents (abfd)
internal_a.magic = ZMAGIC;
#endif
#if defined(VAX)
#define __A_MAGIC_SET__
internal_a.magic = (abfd->flags & D_PAGED) ? VAX_AOUTHDR_ZMAGIC :
(abfd->flags & WP_TEXT) ? VAX_AOUTHDR_NMAGIC :
VAX_AOUTHDR_OMAGIC;
#endif
#if defined(PPC_PE)
#define __A_MAGIC_SET__
internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;

View File

@ -607,6 +607,11 @@ case "${targ}" in
targ_underscore=yes
;;
vax-*-sysv3)
targ_defvec=vaxcoff_vec
targ_underscore=yes
;;
we32k-*-*)
targ_defvec=we32kcoff_vec
;;

View File

@ -2829,6 +2829,7 @@ do
tekhex_vec) tb="$tb tekhex.lo" ;;
tic30_aout_vec) tb="$tb aout-tic30.lo" ;;
tic30_coff_vec) tb="$tb coff-tic30.lo" ;;
vaxcoff_vec) tb="$tb coff-vax.lo" ;;
we32kcoff_vec) tb="$tb coff-we32k.lo" ;;
z8kcoff_vec) tb="$tb coff-z8k.lo reloc16.lo" ;;
w65_vec) tb="$tb coff-w65.lo reloc16.lo" ;;

View File

@ -587,6 +587,7 @@ extern const bfd_target sunos_big_vec;
extern const bfd_target tekhex_vec;
extern const bfd_target tic30_aout_vec;
extern const bfd_target tic30_coff_vec;
extern const bfd_target vaxcoff_vec;
extern const bfd_target vaxnetbsd_vec;
extern const bfd_target host_aout_vec;
extern const bfd_target versados_vec;
@ -800,6 +801,7 @@ static const bfd_target * const _bfd_target_vector[] = {
&tekhex_vec,
&tic30_aout_vec,
&tic30_coff_vec,
&vaxcoff_vec,
&vaxnetbsd_vec,
&versados_vec,
&we32kcoff_vec,

205
gnu/dist/include/coff/vax.h vendored Normal file
View File

@ -0,0 +1,205 @@
/*** coff information for vax */
/********************** FILE HEADER **********************/
struct external_filehdr {
char f_magic[2]; /* magic number */
char f_nscns[2]; /* number of sections */
char f_timdat[4]; /* time & date stamp */
char f_symptr[4]; /* file pointer to symtab */
char f_nsyms[4]; /* number of symtab entries */
char f_opthdr[2]; /* sizeof(optional hdr) */
char f_flags[2]; /* flags */
};
/* Bits for f_flags:
* F_RELFLG relocation info stripped from file
* F_EXEC file is executable (no unresolved external references)
* F_LNNO line numbers stripped from file
* F_LSYMS local symbols stripped from file
*/
#define F_RELFLG (0x0001)
#define F_EXEC (0x0002)
#define F_LNNO (0x0004)
#define F_LSYMS (0x0008)
#define VAX_AOUTHDR_OMAGIC 0404 /* object files, eg as output */
#define VAX_AOUTHDR_NMAGIC 0410 /* read only text output */
#define VAX_AOUTHDR_ZMAGIC 0413 /* demand load format, eg normal ld output */
#define VAX_AOUTHDR_STMAGIC 0401 /* target shlib */
#define VAX_AOUTHDR_SHMAGIC 0443 /* host shlib */
#define VAXRWMAGIC 0570 /* vax read-write */
#define VAXROMAGIC 0575 /* vax read-only */
#define VAXBADMAG(x) (((x).f_magic != VAXROMAGIC) \
&& ((x).f_magic != VAXRWMAGIC))
#define FILHDR struct external_filehdr
#define FILHSZ 20
/********************** AOUT "OPTIONAL HEADER" **********************/
typedef struct
{
char magic[2]; /* type of file */
char vstamp[2]; /* version stamp */
char tsize[4]; /* text size in bytes, padded to FW bdry*/
char dsize[4]; /* initialized data " " */
char bsize[4]; /* uninitialized data " " */
char entry[4]; /* entry pt. */
char text_start[4]; /* base of text used for this file */
char data_start[4]; /* base of data used for this file */
}
AOUTHDR;
#define AOUTSZ 28
#define AOUTHDRSZ 28
/********************** SECTION HEADER **********************/
struct external_scnhdr {
char s_name[8]; /* section name */
char s_paddr[4]; /* physical address, aliased s_nlib */
char s_vaddr[4]; /* virtual address */
char s_size[4]; /* section size */
char s_scnptr[4]; /* file ptr to raw data for section */
char s_relptr[4]; /* file ptr to relocation */
char s_lnnoptr[4]; /* file ptr to line numbers */
char s_nreloc[2]; /* number of relocation entries */
char s_nlnno[2]; /* number of line number entries*/
char s_flags[4]; /* flags */
};
#define SCNHDR struct external_scnhdr
#define SCNHSZ 40
/*
* names of "special" sections
*/
#define _TEXT ".text"
#define _DATA ".data"
#define _BSS ".bss"
#define _TV ".tv"
#define _INIT ".init"
#define _FINI ".fini"
/********************** LINE NUMBERS **********************/
/* 1 line number entry for every "breakpointable" source line in a section.
* Line numbers are grouped on a per function basis; first entry in a function
* grouping will have l_lnno = 0 and in place of physical address will be the
* symbol table index of the function name.
*/
struct external_lineno {
union {
char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/
char l_paddr[4]; /* (physical) address of line number */
} l_addr;
char l_lnno[2]; /* line number */
};
#define LINENO struct external_lineno
#define LINESZ 6
/********************** SYMBOLS **********************/
#define E_SYMNMLEN 8 /* # characters in a symbol name */
#define E_FILNMLEN 14 /* # characters in a file name */
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */
struct external_syment
{
union {
char e_name[E_SYMNMLEN];
struct {
char e_zeroes[4];
char e_offset[4];
} e;
} e;
char e_value[4];
char e_scnum[2];
char e_type[2];
char e_sclass[1];
char e_numaux[1];
};
#define N_BTMASK (0xf)
#define N_TMASK (0x30)
#define N_BTSHFT (4)
#define N_TSHIFT (2)
union external_auxent {
struct {
char x_tagndx[4]; /* str, un, or enum tag indx */
union {
struct {
char x_lnno[2]; /* declaration line number */
char x_size[2]; /* str/union/array size */
} x_lnsz;
char x_fsize[4]; /* size of function */
} x_misc;
union {
struct { /* if ISFCN, tag, or .bb */
char x_lnnoptr[4]; /* ptr to fcn line # */
char x_endndx[4]; /* entry ndx past block end */
} x_fcn;
struct { /* if ISARY, up to 4 dimen. */
char x_dimen[E_DIMNUM][2];
} x_ary;
} x_fcnary;
char x_tvndx[2]; /* tv index */
} x_sym;
union {
char x_fname[E_FILNMLEN];
struct {
char x_zeroes[4];
char x_offset[4];
} x_n;
} x_file;
struct {
char x_scnlen[4]; /* section length */
char x_nreloc[2]; /* # relocation entries */
char x_nlinno[2]; /* # line numbers */
} x_scn;
struct {
char x_tvfill[4]; /* tv fill value */
char x_tvlen[2]; /* length of .tv */
char x_tvran[2][2]; /* tv range */
} x_tv; /* info about .tv section (in auxent of symbol .tv)) */
};
#define SYMENT struct external_syment
#define SYMESZ 18
#define AUXENT union external_auxent
#define AUXESZ 18
# define _ETEXT "etext"
/********************** RELOCATION DIRECTIVES **********************/
struct external_reloc {
char r_vaddr[4];
char r_symndx[4];
char r_type[2];
};
#define RELOC struct external_reloc
#define RELSZ 10

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.13 1999/12/26 19:48:01 msaitoh Exp $
# $NetBSD: Makefile,v 1.14 2000/01/11 05:48:30 matt Exp $
LIB= bfd
@ -208,8 +208,8 @@ SRCS+= elf64-sparc.c elf64.c
.if (${MACHINE_ARCH} == "vax" || !defined(BFD_SLIM))
ARCHES+= vax
DEFAULT_VEC.vax= vaxnetbsd_vec
SELECT_VECS+= ${DEFAULT_VEC.vax}
SRCS+= cpu-vax.c vaxnetbsd.c vax-dis.c aout32.c
SELECT_VECS+= ${DEFAULT_VEC.vax} vaxcoff_vec
SRCS+= cpu-vax.c vaxnetbsd.c vax-dis.c aout32.c coff-vax.c
.endif
# uniq-ify SRCS and SELECT_VECS