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:
parent
d3ae549f72
commit
b9db4a8140
109
gnu/dist/bfd/coff-vax.c
vendored
Normal file
109
gnu/dist/bfd/coff-vax.c
vendored
Normal 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,
|
||||
};
|
22
gnu/dist/bfd/coffcode.h
vendored
22
gnu/dist/bfd/coffcode.h
vendored
@ -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;
|
||||
|
5
gnu/dist/bfd/config.bfd
vendored
5
gnu/dist/bfd/config.bfd
vendored
@ -607,6 +607,11 @@ case "${targ}" in
|
||||
targ_underscore=yes
|
||||
;;
|
||||
|
||||
vax-*-sysv3)
|
||||
targ_defvec=vaxcoff_vec
|
||||
targ_underscore=yes
|
||||
;;
|
||||
|
||||
we32k-*-*)
|
||||
targ_defvec=we32kcoff_vec
|
||||
;;
|
||||
|
1
gnu/dist/bfd/configure
vendored
1
gnu/dist/bfd/configure
vendored
@ -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" ;;
|
||||
|
2
gnu/dist/bfd/targets.c
vendored
2
gnu/dist/bfd/targets.c
vendored
@ -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
205
gnu/dist/include/coff/vax.h
vendored
Normal 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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user