2004-02-26 14:36:15 +01:00
|
|
|
/* $XFree86: xc/programs/Xserver/hw/xfree86/loader/coff.h,v 1.6 2003/10/15 16:29:02 dawes Exp $ */
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
/* This file was implemented from the information in the book
|
|
|
|
Understanding and Using COFF
|
|
|
|
Gintaras R. Gircys
|
|
|
|
O'Reilly, 1988
|
|
|
|
and by looking at the Linux kernel code.
|
|
|
|
|
|
|
|
It is therefore most likely free to use...
|
|
|
|
|
|
|
|
If the file format changes in the COFF object, this file should be
|
|
|
|
subsequently updated to reflect the changes.
|
|
|
|
|
|
|
|
The actual loader module only uses a few of the COFF structures.
|
|
|
|
Only those are included here. If you wish more information about
|
|
|
|
COFF, thein check out the book mentioned above.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _COFF_H
|
|
|
|
#define _COFF_H
|
|
|
|
|
2003-11-25 20:29:01 +01:00
|
|
|
#define E_SYMNMLEN 8 /* Number of characters in a symbol name */
|
2003-11-14 17:48:57 +01:00
|
|
|
/*
|
|
|
|
* Intel 386/486
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* FILE HEADER
|
|
|
|
*/
|
|
|
|
|
2003-11-25 20:29:01 +01:00
|
|
|
typedef struct COFF_filehdr {
|
|
|
|
unsigned short f_magic; /* magic number */
|
|
|
|
unsigned short f_nscns; /* number of sections */
|
|
|
|
long f_timdat; /* time & date stamp */
|
|
|
|
long f_symptr; /* file pointer to symtab */
|
|
|
|
long f_nsyms; /* number of symtab entries */
|
|
|
|
unsigned short f_opthdr; /* sizeof(optional hdr) */
|
|
|
|
unsigned short f_flags; /* flags */
|
2003-11-14 17:48:57 +01:00
|
|
|
} FILHDR;
|
|
|
|
|
|
|
|
#define FILHSZ sizeof(FILHDR)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SECTION HEADER
|
|
|
|
*/
|
|
|
|
|
2003-11-25 20:29:01 +01:00
|
|
|
typedef struct COFF_scnhdr {
|
|
|
|
char s_name[8]; /* section name */
|
|
|
|
long s_paddr; /* physical address */
|
|
|
|
long s_vaddr; /* virtual address */
|
|
|
|
long s_size; /* section size */
|
|
|
|
long s_scnptr; /* raw data for section */
|
|
|
|
long s_relptr; /* relocation */
|
|
|
|
long s_lnnoptr; /* line numbers */
|
|
|
|
unsigned short s_nreloc; /* number of relocation entries */
|
|
|
|
unsigned short s_nlnno; /* number of line number entries */
|
|
|
|
long s_flags; /* flags */
|
2003-11-14 17:48:57 +01:00
|
|
|
} SCNHDR;
|
|
|
|
|
|
|
|
#define COFF_SCNHDR struct COFF_scnhdr
|
|
|
|
#define COFF_SCNHSZ sizeof(COFF_SCNHDR)
|
|
|
|
#define SCNHSZ COFF_SCNHSZ
|
|
|
|
|
|
|
|
/*
|
|
|
|
* the optional COFF header as used by Linux COFF
|
|
|
|
*/
|
|
|
|
|
2003-11-25 20:29:01 +01:00
|
|
|
typedef struct {
|
|
|
|
char magic[2]; /* type of file */
|
|
|
|
char vstamp[2]; /* version stamp */
|
|
|
|
char tsize[4]; /* text size in bytes */
|
|
|
|
char dsize[4]; /* initialized data */
|
|
|
|
char bsize[4]; /* uninitialized data */
|
|
|
|
char entry[4]; /* entry point */
|
|
|
|
char text_start[4]; /* base of text */
|
|
|
|
char data_start[4]; /* base of data */
|
2003-11-14 17:48:57 +01:00
|
|
|
} AOUTHDR;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SYMBOLS
|
|
|
|
*/
|
|
|
|
|
2003-11-25 20:29:01 +01:00
|
|
|
typedef struct COFF_syment {
|
|
|
|
union {
|
|
|
|
char _n_name[E_SYMNMLEN]; /* Symbol name (first 8 chars) */
|
|
|
|
struct {
|
|
|
|
long _n_zeroes; /* Leading zeros */
|
|
|
|
long _n_offset; /* Offset for a header section */
|
2003-11-14 17:48:57 +01:00
|
|
|
} _n_n;
|
2003-11-25 20:29:01 +01:00
|
|
|
char *_n_nptr[2]; /* allows for overlaying */
|
|
|
|
} _n;
|
|
|
|
|
|
|
|
long n_value; /* address of the segment */
|
|
|
|
short n_scnum; /* Section number */
|
|
|
|
unsigned short n_type; /* Type of section */
|
|
|
|
char n_sclass; /* Loader class */
|
|
|
|
char n_numaux; /* Number of aux entries following */
|
2003-11-14 17:48:57 +01:00
|
|
|
} SYMENT;
|
|
|
|
|
|
|
|
#define n_name _n._n_name
|
|
|
|
#define n_nptr _n._n_nptr[1]
|
|
|
|
#define n_zeroes _n._n_n._n_zeroes
|
|
|
|
#define n_offset _n._n_n._n_offset
|
|
|
|
|
2003-11-25 20:29:01 +01:00
|
|
|
#define COFF_E_SYMNMLEN 8 /* characters in a short symbol name */
|
|
|
|
#define COFF_E_FILNMLEN 14 /* characters in a file name */
|
2003-11-14 17:48:57 +01:00
|
|
|
#define COFF_E_DIMNUM 4 /* array dimensions in aux entry */
|
|
|
|
#define SYMNMLEN COFF_E_SYMNMLEN
|
|
|
|
#define SYMESZ 18 /* not really sizeof(SYMENT) due to padding */
|
|
|
|
|
|
|
|
/* Special section number found in the symbol section */
|
|
|
|
#define N_UNDEF 0
|
|
|
|
#define N_ABS -1
|
|
|
|
#define N_DEBUG -2
|
|
|
|
|
|
|
|
/* Symbol storage class values */
|
|
|
|
#define C_NULL 0
|
|
|
|
#define C_EXT 2
|
|
|
|
#define C_FILE 103
|
|
|
|
#define C_HIDEXT 107
|
|
|
|
|
|
|
|
/*
|
|
|
|
* AUX Entries
|
|
|
|
*/
|
|
|
|
typedef struct COFF_auxent {
|
2003-11-25 20:29:01 +01:00
|
|
|
long x_scnlen;
|
|
|
|
long x_parmhash;
|
|
|
|
unsigned short x_snhash;
|
|
|
|
unsigned char x_smtyp;
|
|
|
|
unsigned char x_smclas;
|
|
|
|
long x_stab;
|
|
|
|
unsigned short x_snstab;
|
2003-11-14 17:48:57 +01:00
|
|
|
} AUXENT;
|
|
|
|
|
|
|
|
/* Auxillary Symbol type values */
|
2003-11-25 20:29:01 +01:00
|
|
|
#define XTY_ER 0 /* Enternal Reference */
|
|
|
|
#define XTY_SD 1 /* csect section definition */
|
|
|
|
#define XTY_LD 2 /* Label definition */
|
|
|
|
#define XTY_CM 3 /* common csect definition */
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
/* Auxillary Symbol storage mapping class values */
|
2003-11-25 20:29:01 +01:00
|
|
|
#define XMC_PR 0 /* Program code */
|
|
|
|
#define XMC_RO 1 /* Read-only constant */
|
|
|
|
#define XMC_DB 2 /* Debug dictionary */
|
|
|
|
#define XMC_TC 3 /* TOC entry */
|
|
|
|
#define XMC_UA 4 /* Unclassified */
|
|
|
|
#define XMC_RW 5 /* Read/write data */
|
|
|
|
#define XMC_GL 6 /* Global linkage */
|
|
|
|
#define XMC_XO 7 /* Extended operation */
|
|
|
|
#define XMC_SV 8 /* Supervisor call descriptor */
|
|
|
|
#define XMC_BS 9 /* BSS class */
|
|
|
|
#define XMC_DS 10 /* Function descriptor csect */
|
|
|
|
#define XMC_UC 11 /* Unnamed FORTRAN comon */
|
|
|
|
#define XMC_TI 12 /* Reserved */
|
|
|
|
#define XMC_TB 13 /* Reserved */
|
|
|
|
#define XMC_TC0 15 /* TOC anchor */
|
|
|
|
#define XMC_TD 16 /* Scalar data entry in TOC */
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* RELOCATION DIRECTIVES
|
|
|
|
*/
|
|
|
|
|
2003-11-25 20:29:01 +01:00
|
|
|
typedef struct COFF_reloc {
|
|
|
|
long r_vaddr; /* Virtual address of item */
|
|
|
|
long r_symndx; /* Symbol index in the symtab */
|
2003-11-14 17:48:57 +01:00
|
|
|
#if defined(__powerpc__)
|
2003-11-25 20:29:01 +01:00
|
|
|
union {
|
|
|
|
unsigned short _r_type; /* old style coff relocation type */
|
|
|
|
struct {
|
|
|
|
char _r_rsize; /* sign and reloc bit len */
|
|
|
|
char _r_rtype; /* toc relocation type */
|
2003-11-14 17:48:57 +01:00
|
|
|
} _r_r;
|
2003-11-25 20:29:01 +01:00
|
|
|
} _r;
|
|
|
|
#define r_otype _r._r_type /* old style reloc - original name */
|
2003-11-14 17:48:57 +01:00
|
|
|
#define r_rsize _r._r_r._r_rsize /* extract sign and bit len */
|
|
|
|
#define r_type _r._r_r._r_rtype /* extract toc relocation type */
|
|
|
|
#else
|
2003-11-25 20:29:01 +01:00
|
|
|
unsigned short r_type; /* Relocation type */
|
2003-11-14 17:48:57 +01:00
|
|
|
#endif
|
|
|
|
} RELOC;
|
|
|
|
|
|
|
|
#define COFF_RELOC struct COFF_reloc
|
|
|
|
#define COFF_RELSZ 10
|
|
|
|
#define RELSZ COFF_RELSZ
|
|
|
|
|
|
|
|
/*
|
|
|
|
* x86 Relocation types
|
|
|
|
*/
|
|
|
|
#define R_ABS 000
|
|
|
|
#define R_DIR32 006
|
|
|
|
#define R_PCRLONG 024
|
|
|
|
|
|
|
|
#if defined(__powerpc__)
|
|
|
|
/*
|
|
|
|
* Power PC
|
|
|
|
*/
|
|
|
|
#define R_LEN 0x1F /* extract bit-length field */
|
|
|
|
#define R_SIGN 0x80 /* extract sign of relocation */
|
|
|
|
#define R_FIXUP 0x40 /* extract code-fixup bit */
|
|
|
|
|
|
|
|
#define RELOC_RLEN(x) ((x)._r._r_r._r_rsize & R_LEN)
|
|
|
|
#define RELOC_RSIGN(x) ((x)._r._r_r._r_rsize & R_SIGN)
|
|
|
|
#define RELOC_RFIXUP(x) ((x)._r._r_r._r_rsize & R_FIXUP)
|
|
|
|
#define RELOC_RTYPE(x) ((x)._r._r_r._r_rtype)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* POWER and PowerPC - relocation types
|
|
|
|
*/
|
|
|
|
#define R_POS 0x00 /* A(sym) Positive Relocation */
|
|
|
|
#define R_NEG 0x01 /* -A(sym) Negative Relocation */
|
|
|
|
#define R_REL 0x02 /* A(sym-*) Relative to self */
|
|
|
|
#define R_TOC 0x03 /* A(sym-TOC) Relative to TOC */
|
|
|
|
#define R_TRL 0x12 /* A(sym-TOC) TOC Relative indirect load. */
|
2003-11-25 20:29:01 +01:00
|
|
|
/* modifiable instruction */
|
2003-11-14 17:48:57 +01:00
|
|
|
#define R_TRLA 0x13 /* A(sym-TOC) TOC Rel load address. modifiable inst */
|
|
|
|
#define R_GL 0x05 /* A(external TOC of sym) Global Linkage */
|
|
|
|
#define R_TCL 0x06 /* A(local TOC of sym) Local object TOC address */
|
|
|
|
#define R_RL 0x0C /* A(sym) Pos indirect load. modifiable instruction */
|
|
|
|
#define R_RLA 0x0D /* A(sym) Pos Load Address. modifiable instruction */
|
|
|
|
#define R_REF 0x0F /* AL0(sym) Non relocating ref. No garbage collect */
|
|
|
|
#define R_BA 0x08 /* A(sym) Branch absolute. Cannot modify instruction */
|
|
|
|
#define R_RBA 0x18 /* A(sym) Branch absolute. modifiable instruction */
|
|
|
|
#define R_RBAC 0x19 /* A(sym) Branch absolute constant. modifiable instr */
|
|
|
|
#define R_BR 0x0A /* A(sym-*) Branch rel to self. non modifiable */
|
|
|
|
#define R_RBR 0x1A /* A(sym-*) Branch rel to self. modifiable instr */
|
|
|
|
#define R_RBRC 0x1B /* A(sym-*) Branch absolute const. */
|
|
|
|
/* modifiable to R_RBR */
|
|
|
|
#define R_RTB 0x04 /* A((sym-*)/2) RT IAR Rel Branch. non modifiable */
|
|
|
|
#define R_RRTBI 0x14 /* A((sym-*)/2) RT IAR Rel Br. modifiable to R_RRTBA */
|
|
|
|
#define R_RRTBA 0x15 /* A((sym-*)/2) RT absolute br. modifiable to R_RRTBI */
|
|
|
|
#endif /* __powerpc */
|
|
|
|
|
|
|
|
#endif /* _COFF_H */
|