xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/linux/coff.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi /* This file is derived from the GAS 2.1.4 assembler control file.
2*53ee8cc1Swenshuai.xi    The GAS product is under the GNU General Public License, version 2 or later.
3*53ee8cc1Swenshuai.xi    As such, this file is also under that license.
4*53ee8cc1Swenshuai.xi 
5*53ee8cc1Swenshuai.xi    If the file format changes in the COFF object, this file should be
6*53ee8cc1Swenshuai.xi    subsequently updated to reflect the changes.
7*53ee8cc1Swenshuai.xi 
8*53ee8cc1Swenshuai.xi    The actual loader module only uses a few of these structures. The full
9*53ee8cc1Swenshuai.xi    set is documented here because I received the full set. If you wish
10*53ee8cc1Swenshuai.xi    more information about COFF, then O'Reilly has a very excellent book.
11*53ee8cc1Swenshuai.xi */
12*53ee8cc1Swenshuai.xi 
13*53ee8cc1Swenshuai.xi #define  E_SYMNMLEN  8   /* Number of characters in a symbol name         */
14*53ee8cc1Swenshuai.xi #define  E_FILNMLEN 14   /* Number of characters in a file name           */
15*53ee8cc1Swenshuai.xi #define  E_DIMNUM    4   /* Number of array dimensions in auxiliary entry */
16*53ee8cc1Swenshuai.xi 
17*53ee8cc1Swenshuai.xi /*
18*53ee8cc1Swenshuai.xi  * These defines are byte order independent. There is no alignment of fields
19*53ee8cc1Swenshuai.xi  * permitted in the structures. Therefore they are declared as characters
20*53ee8cc1Swenshuai.xi  * and the values loaded from the character positions. It also makes it
21*53ee8cc1Swenshuai.xi  * nice to have it "endian" independent.
22*53ee8cc1Swenshuai.xi  */
23*53ee8cc1Swenshuai.xi 
24*53ee8cc1Swenshuai.xi /* Load a short int from the following tables with little-endian formats */
25*53ee8cc1Swenshuai.xi #define COFF_SHORT_L(ps) ((short)(((unsigned short)((unsigned char)ps[1])<<8)|\
26*53ee8cc1Swenshuai.xi 				  ((unsigned short)((unsigned char)ps[0]))))
27*53ee8cc1Swenshuai.xi 
28*53ee8cc1Swenshuai.xi /* Load a long int from the following tables with little-endian formats */
29*53ee8cc1Swenshuai.xi #define COFF_LONG_L(ps) (((long)(((unsigned long)((unsigned char)ps[3])<<24) |\
30*53ee8cc1Swenshuai.xi 				 ((unsigned long)((unsigned char)ps[2])<<16) |\
31*53ee8cc1Swenshuai.xi 				 ((unsigned long)((unsigned char)ps[1])<<8)  |\
32*53ee8cc1Swenshuai.xi 				 ((unsigned long)((unsigned char)ps[0])))))
33*53ee8cc1Swenshuai.xi 
34*53ee8cc1Swenshuai.xi /* Load a short int from the following tables with big-endian formats */
35*53ee8cc1Swenshuai.xi #define COFF_SHORT_H(ps) ((short)(((unsigned short)((unsigned char)ps[0])<<8)|\
36*53ee8cc1Swenshuai.xi 				  ((unsigned short)((unsigned char)ps[1]))))
37*53ee8cc1Swenshuai.xi 
38*53ee8cc1Swenshuai.xi /* Load a long int from the following tables with big-endian formats */
39*53ee8cc1Swenshuai.xi #define COFF_LONG_H(ps) (((long)(((unsigned long)((unsigned char)ps[0])<<24) |\
40*53ee8cc1Swenshuai.xi 				 ((unsigned long)((unsigned char)ps[1])<<16) |\
41*53ee8cc1Swenshuai.xi 				 ((unsigned long)((unsigned char)ps[2])<<8)  |\
42*53ee8cc1Swenshuai.xi 				 ((unsigned long)((unsigned char)ps[3])))))
43*53ee8cc1Swenshuai.xi 
44*53ee8cc1Swenshuai.xi /* These may be overridden later by brain dead implementations which generate
45*53ee8cc1Swenshuai.xi    a big-endian header with little-endian data. In that case, generate a
46*53ee8cc1Swenshuai.xi    replacement macro which tests a flag and uses either of the two above
47*53ee8cc1Swenshuai.xi    as appropriate. */
48*53ee8cc1Swenshuai.xi 
49*53ee8cc1Swenshuai.xi #define COFF_LONG(v)   COFF_LONG_L(v)
50*53ee8cc1Swenshuai.xi #define COFF_SHORT(v)  COFF_SHORT_L(v)
51*53ee8cc1Swenshuai.xi 
52*53ee8cc1Swenshuai.xi /*** coff information for Intel 386/486.  */
53*53ee8cc1Swenshuai.xi 
54*53ee8cc1Swenshuai.xi /********************** FILE HEADER **********************/
55*53ee8cc1Swenshuai.xi 
56*53ee8cc1Swenshuai.xi struct COFF_filehdr {
57*53ee8cc1Swenshuai.xi 	char f_magic[2];	/* magic number			*/
58*53ee8cc1Swenshuai.xi 	char f_nscns[2];	/* number of sections		*/
59*53ee8cc1Swenshuai.xi 	char f_timdat[4];	/* time & date stamp		*/
60*53ee8cc1Swenshuai.xi 	char f_symptr[4];	/* file pointer to symtab	*/
61*53ee8cc1Swenshuai.xi 	char f_nsyms[4];	/* number of symtab entries	*/
62*53ee8cc1Swenshuai.xi 	char f_opthdr[2];	/* sizeof(optional hdr)		*/
63*53ee8cc1Swenshuai.xi 	char f_flags[2];	/* flags			*/
64*53ee8cc1Swenshuai.xi };
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi /*
67*53ee8cc1Swenshuai.xi  *   Bits for f_flags:
68*53ee8cc1Swenshuai.xi  *
69*53ee8cc1Swenshuai.xi  *	F_RELFLG	relocation info stripped from file
70*53ee8cc1Swenshuai.xi  *	F_EXEC		file is executable  (i.e. no unresolved external
71*53ee8cc1Swenshuai.xi  *			references)
72*53ee8cc1Swenshuai.xi  *	F_LNNO		line numbers stripped from file
73*53ee8cc1Swenshuai.xi  *	F_LSYMS		local symbols stripped from file
74*53ee8cc1Swenshuai.xi  *	F_MINMAL	this is a minimal object file (".m") output of fextract
75*53ee8cc1Swenshuai.xi  *	F_UPDATE	this is a fully bound update file, output of ogen
76*53ee8cc1Swenshuai.xi  *	F_SWABD		this file has had its bytes swabbed (in names)
77*53ee8cc1Swenshuai.xi  *	F_AR16WR	this file has the byte ordering of an AR16WR
78*53ee8cc1Swenshuai.xi  *			(e.g. 11/70) machine
79*53ee8cc1Swenshuai.xi  *	F_AR32WR	this file has the byte ordering of an AR32WR machine
80*53ee8cc1Swenshuai.xi  *			(e.g. vax and iNTEL 386)
81*53ee8cc1Swenshuai.xi  *	F_AR32W		this file has the byte ordering of an AR32W machine
82*53ee8cc1Swenshuai.xi  *			(e.g. 3b,maxi)
83*53ee8cc1Swenshuai.xi  *	F_PATCH		file contains "patch" list in optional header
84*53ee8cc1Swenshuai.xi  *	F_NODF		(minimal file only) no decision functions for
85*53ee8cc1Swenshuai.xi  *			replaced functions
86*53ee8cc1Swenshuai.xi  */
87*53ee8cc1Swenshuai.xi 
88*53ee8cc1Swenshuai.xi #define  COFF_F_RELFLG		0000001
89*53ee8cc1Swenshuai.xi #define  COFF_F_EXEC		0000002
90*53ee8cc1Swenshuai.xi #define  COFF_F_LNNO		0000004
91*53ee8cc1Swenshuai.xi #define  COFF_F_LSYMS		0000010
92*53ee8cc1Swenshuai.xi #define  COFF_F_MINMAL		0000020
93*53ee8cc1Swenshuai.xi #define  COFF_F_UPDATE		0000040
94*53ee8cc1Swenshuai.xi #define  COFF_F_SWABD		0000100
95*53ee8cc1Swenshuai.xi #define  COFF_F_AR16WR		0000200
96*53ee8cc1Swenshuai.xi #define  COFF_F_AR32WR		0000400
97*53ee8cc1Swenshuai.xi #define  COFF_F_AR32W		0001000
98*53ee8cc1Swenshuai.xi #define  COFF_F_PATCH		0002000
99*53ee8cc1Swenshuai.xi #define  COFF_F_NODF		0002000
100*53ee8cc1Swenshuai.xi 
101*53ee8cc1Swenshuai.xi #define	COFF_I386MAGIC	        0x14c   /* Linux's system    */
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi #if 0   /* Perhaps, someday, these formats may be used.      */
104*53ee8cc1Swenshuai.xi #define COFF_I386PTXMAGIC	0x154
105*53ee8cc1Swenshuai.xi #define COFF_I386AIXMAGIC	0x175   /* IBM's AIX system  */
106*53ee8cc1Swenshuai.xi #define COFF_I386BADMAG(x) ((COFF_SHORT((x).f_magic) != COFF_I386MAGIC) \
107*53ee8cc1Swenshuai.xi 			  && COFF_SHORT((x).f_magic) != COFF_I386PTXMAGIC \
108*53ee8cc1Swenshuai.xi 			  && COFF_SHORT((x).f_magic) != COFF_I386AIXMAGIC)
109*53ee8cc1Swenshuai.xi #else
110*53ee8cc1Swenshuai.xi #define COFF_I386BADMAG(x) (COFF_SHORT((x).f_magic) != COFF_I386MAGIC)
111*53ee8cc1Swenshuai.xi #endif
112*53ee8cc1Swenshuai.xi 
113*53ee8cc1Swenshuai.xi #define	COFF_FILHDR	struct COFF_filehdr
114*53ee8cc1Swenshuai.xi #define	COFF_FILHSZ	sizeof(COFF_FILHDR)
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi /********************** AOUT "OPTIONAL HEADER" **********************/
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi /* Linux COFF must have this "optional" header. Standard COFF has no entry
119*53ee8cc1Swenshuai.xi    location for the "entry" point. They normally would start with the first
120*53ee8cc1Swenshuai.xi    location of the .text section. This is not a good idea for linux. So,
121*53ee8cc1Swenshuai.xi    the use of this "optional" header is not optional. It is required.
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi    Do not be tempted to assume that the size of the optional header is
124*53ee8cc1Swenshuai.xi    a constant and simply index the next byte by the size of this structure.
125*53ee8cc1Swenshuai.xi    Use the 'f_opthdr' field in the main coff header for the size of the
126*53ee8cc1Swenshuai.xi    structure actually written to the file!!
127*53ee8cc1Swenshuai.xi */
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi typedef struct
130*53ee8cc1Swenshuai.xi {
131*53ee8cc1Swenshuai.xi   char 	magic[2];		/* type of file				 */
132*53ee8cc1Swenshuai.xi   char	vstamp[2];		/* version stamp			 */
133*53ee8cc1Swenshuai.xi   char	tsize[4];		/* text size in bytes, padded to FW bdry */
134*53ee8cc1Swenshuai.xi   char	dsize[4];		/* initialized   data "   "		 */
135*53ee8cc1Swenshuai.xi   char	bsize[4];		/* uninitialized data "   "		 */
136*53ee8cc1Swenshuai.xi   char	entry[4];		/* entry pt.				 */
137*53ee8cc1Swenshuai.xi   char 	text_start[4];		/* base of text used for this file       */
138*53ee8cc1Swenshuai.xi   char 	data_start[4];		/* base of data used for this file       */
139*53ee8cc1Swenshuai.xi }
140*53ee8cc1Swenshuai.xi COFF_AOUTHDR;
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi #define COFF_AOUTSZ (sizeof(COFF_AOUTHDR))
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi #define COFF_STMAGIC	0401
145*53ee8cc1Swenshuai.xi #define COFF_OMAGIC     0404
146*53ee8cc1Swenshuai.xi #define COFF_JMAGIC     0407    /* dirty text and data image, can't share  */
147*53ee8cc1Swenshuai.xi #define COFF_DMAGIC     0410    /* dirty text segment, data aligned        */
148*53ee8cc1Swenshuai.xi #define COFF_ZMAGIC     0413    /* The proper magic number for executables  */
149*53ee8cc1Swenshuai.xi #define COFF_SHMAGIC	0443	/* shared library header                   */
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi /********************** SECTION HEADER **********************/
152*53ee8cc1Swenshuai.xi 
153*53ee8cc1Swenshuai.xi struct COFF_scnhdr {
154*53ee8cc1Swenshuai.xi   char		s_name[8];	/* section name			    */
155*53ee8cc1Swenshuai.xi   char		s_paddr[4];	/* physical address, aliased s_nlib */
156*53ee8cc1Swenshuai.xi   char		s_vaddr[4];	/* virtual address		    */
157*53ee8cc1Swenshuai.xi   char		s_size[4];	/* section size			    */
158*53ee8cc1Swenshuai.xi   char		s_scnptr[4];	/* file ptr to raw data for section */
159*53ee8cc1Swenshuai.xi   char		s_relptr[4];	/* file ptr to relocation	    */
160*53ee8cc1Swenshuai.xi   char		s_lnnoptr[4];	/* file ptr to line numbers	    */
161*53ee8cc1Swenshuai.xi   char		s_nreloc[2];	/* number of relocation entries	    */
162*53ee8cc1Swenshuai.xi   char		s_nlnno[2];	/* number of line number entries    */
163*53ee8cc1Swenshuai.xi   char		s_flags[4];	/* flags			    */
164*53ee8cc1Swenshuai.xi };
165*53ee8cc1Swenshuai.xi 
166*53ee8cc1Swenshuai.xi #define	COFF_SCNHDR	struct COFF_scnhdr
167*53ee8cc1Swenshuai.xi #define	COFF_SCNHSZ	sizeof(COFF_SCNHDR)
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi /*
170*53ee8cc1Swenshuai.xi  * names of "special" sections
171*53ee8cc1Swenshuai.xi  */
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi #define COFF_TEXT	".text"
174*53ee8cc1Swenshuai.xi #define COFF_DATA	".data"
175*53ee8cc1Swenshuai.xi #define COFF_BSS	".bss"
176*53ee8cc1Swenshuai.xi #define COFF_COMMENT    ".comment"
177*53ee8cc1Swenshuai.xi #define COFF_LIB        ".lib"
178*53ee8cc1Swenshuai.xi 
179*53ee8cc1Swenshuai.xi #define COFF_SECT_TEXT  0      /* Section for instruction code             */
180*53ee8cc1Swenshuai.xi #define COFF_SECT_DATA  1      /* Section for initialized globals          */
181*53ee8cc1Swenshuai.xi #define COFF_SECT_BSS   2      /* Section for un-initialized globals       */
182*53ee8cc1Swenshuai.xi #define COFF_SECT_REQD  3      /* Minimum number of sections for good file */
183*53ee8cc1Swenshuai.xi 
184*53ee8cc1Swenshuai.xi #define COFF_STYP_REG     0x00 /* regular segment                          */
185*53ee8cc1Swenshuai.xi #define COFF_STYP_DSECT   0x01 /* dummy segment                            */
186*53ee8cc1Swenshuai.xi #define COFF_STYP_NOLOAD  0x02 /* no-load segment                          */
187*53ee8cc1Swenshuai.xi #define COFF_STYP_GROUP   0x04 /* group segment                            */
188*53ee8cc1Swenshuai.xi #define COFF_STYP_PAD     0x08 /* .pad segment                             */
189*53ee8cc1Swenshuai.xi #define COFF_STYP_COPY    0x10 /* copy section                             */
190*53ee8cc1Swenshuai.xi #define COFF_STYP_TEXT    0x20 /* .text segment                            */
191*53ee8cc1Swenshuai.xi #define COFF_STYP_DATA    0x40 /* .data segment                            */
192*53ee8cc1Swenshuai.xi #define COFF_STYP_BSS     0x80 /* .bss segment                             */
193*53ee8cc1Swenshuai.xi #define COFF_STYP_INFO   0x200 /* .comment section                         */
194*53ee8cc1Swenshuai.xi #define COFF_STYP_OVER   0x400 /* overlay section                          */
195*53ee8cc1Swenshuai.xi #define COFF_STYP_LIB    0x800 /* library section                          */
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi /*
198*53ee8cc1Swenshuai.xi  * Shared libraries have the following section header in the data field for
199*53ee8cc1Swenshuai.xi  * each library.
200*53ee8cc1Swenshuai.xi  */
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi struct COFF_slib {
203*53ee8cc1Swenshuai.xi   char		sl_entsz[4];	/* Size of this entry               */
204*53ee8cc1Swenshuai.xi   char		sl_pathndx[4];	/* size of the header field         */
205*53ee8cc1Swenshuai.xi };
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi #define	COFF_SLIBHD	struct COFF_slib
208*53ee8cc1Swenshuai.xi #define	COFF_SLIBSZ	sizeof(COFF_SLIBHD)
209*53ee8cc1Swenshuai.xi 
210*53ee8cc1Swenshuai.xi /********************** LINE NUMBERS **********************/
211*53ee8cc1Swenshuai.xi 
212*53ee8cc1Swenshuai.xi /* 1 line number entry for every "breakpointable" source line in a section.
213*53ee8cc1Swenshuai.xi  * Line numbers are grouped on a per function basis; first entry in a function
214*53ee8cc1Swenshuai.xi  * grouping will have l_lnno = 0 and in place of physical address will be the
215*53ee8cc1Swenshuai.xi  * symbol table index of the function name.
216*53ee8cc1Swenshuai.xi  */
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi struct COFF_lineno {
219*53ee8cc1Swenshuai.xi   union {
220*53ee8cc1Swenshuai.xi     char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
221*53ee8cc1Swenshuai.xi     char l_paddr[4];	/* (physical) address of line number	*/
222*53ee8cc1Swenshuai.xi   } l_addr;
223*53ee8cc1Swenshuai.xi   char l_lnno[2];	/* line number		*/
224*53ee8cc1Swenshuai.xi };
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi #define	COFF_LINENO	struct COFF_lineno
227*53ee8cc1Swenshuai.xi #define	COFF_LINESZ	6
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi /********************** SYMBOLS **********************/
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi #define COFF_E_SYMNMLEN	 8	/* # characters in a short symbol name	*/
232*53ee8cc1Swenshuai.xi #define COFF_E_FILNMLEN	14	/* # characters in a file name		*/
233*53ee8cc1Swenshuai.xi #define COFF_E_DIMNUM	 4	/* # array dimensions in auxiliary entry */
234*53ee8cc1Swenshuai.xi 
235*53ee8cc1Swenshuai.xi /*
236*53ee8cc1Swenshuai.xi  *  All symbols and sections have the following definition
237*53ee8cc1Swenshuai.xi  */
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi struct COFF_syment
240*53ee8cc1Swenshuai.xi {
241*53ee8cc1Swenshuai.xi   union {
242*53ee8cc1Swenshuai.xi     char e_name[E_SYMNMLEN];    /* Symbol name (first 8 characters) */
243*53ee8cc1Swenshuai.xi     struct {
244*53ee8cc1Swenshuai.xi       char e_zeroes[4];         /* Leading zeros */
245*53ee8cc1Swenshuai.xi       char e_offset[4];         /* Offset if this is a header section */
246*53ee8cc1Swenshuai.xi     } e;
247*53ee8cc1Swenshuai.xi   } e;
248*53ee8cc1Swenshuai.xi 
249*53ee8cc1Swenshuai.xi   char e_value[4];              /* Value (address) of the segment */
250*53ee8cc1Swenshuai.xi   char e_scnum[2];              /* Section number */
251*53ee8cc1Swenshuai.xi   char e_type[2];               /* Type of section */
252*53ee8cc1Swenshuai.xi   char e_sclass[1];             /* Loader class */
253*53ee8cc1Swenshuai.xi   char e_numaux[1];             /* Number of auxiliary entries which follow */
254*53ee8cc1Swenshuai.xi };
255*53ee8cc1Swenshuai.xi 
256*53ee8cc1Swenshuai.xi #define COFF_N_BTMASK	(0xf)   /* Mask for important class bits */
257*53ee8cc1Swenshuai.xi #define COFF_N_TMASK	(0x30)  /* Mask for important type bits  */
258*53ee8cc1Swenshuai.xi #define COFF_N_BTSHFT	(4)     /* # bits to shift class field   */
259*53ee8cc1Swenshuai.xi #define COFF_N_TSHIFT	(2)     /* # bits to shift type field    */
260*53ee8cc1Swenshuai.xi 
261*53ee8cc1Swenshuai.xi /*
262*53ee8cc1Swenshuai.xi  *  Auxiliary entries because the main table is too limiting.
263*53ee8cc1Swenshuai.xi  */
264*53ee8cc1Swenshuai.xi 
265*53ee8cc1Swenshuai.xi union COFF_auxent {
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi /*
268*53ee8cc1Swenshuai.xi  *  Debugger information
269*53ee8cc1Swenshuai.xi  */
270*53ee8cc1Swenshuai.xi 
271*53ee8cc1Swenshuai.xi   struct {
272*53ee8cc1Swenshuai.xi     char x_tagndx[4];	        /* str, un, or enum tag indx */
273*53ee8cc1Swenshuai.xi     union {
274*53ee8cc1Swenshuai.xi       struct {
275*53ee8cc1Swenshuai.xi 	char  x_lnno[2];        /* declaration line number */
276*53ee8cc1Swenshuai.xi 	char  x_size[2];        /* str/union/array size */
277*53ee8cc1Swenshuai.xi       } x_lnsz;
278*53ee8cc1Swenshuai.xi       char x_fsize[4];	        /* size of function */
279*53ee8cc1Swenshuai.xi     } x_misc;
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi     union {
282*53ee8cc1Swenshuai.xi       struct {		        /* if ISFCN, tag, or .bb */
283*53ee8cc1Swenshuai.xi 	char x_lnnoptr[4];	/* ptr to fcn line # */
284*53ee8cc1Swenshuai.xi 	char x_endndx[4];	/* entry ndx past block end */
285*53ee8cc1Swenshuai.xi       } x_fcn;
286*53ee8cc1Swenshuai.xi 
287*53ee8cc1Swenshuai.xi       struct {		        /* if ISARY, up to 4 dimen. */
288*53ee8cc1Swenshuai.xi 	char x_dimen[E_DIMNUM][2];
289*53ee8cc1Swenshuai.xi       } x_ary;
290*53ee8cc1Swenshuai.xi     } x_fcnary;
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi     char x_tvndx[2];	/* tv index */
293*53ee8cc1Swenshuai.xi   } x_sym;
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi /*
296*53ee8cc1Swenshuai.xi  *   Source file names (debugger information)
297*53ee8cc1Swenshuai.xi  */
298*53ee8cc1Swenshuai.xi 
299*53ee8cc1Swenshuai.xi   union {
300*53ee8cc1Swenshuai.xi     char x_fname[E_FILNMLEN];
301*53ee8cc1Swenshuai.xi     struct {
302*53ee8cc1Swenshuai.xi       char x_zeroes[4];
303*53ee8cc1Swenshuai.xi       char x_offset[4];
304*53ee8cc1Swenshuai.xi     } x_n;
305*53ee8cc1Swenshuai.xi   } x_file;
306*53ee8cc1Swenshuai.xi 
307*53ee8cc1Swenshuai.xi /*
308*53ee8cc1Swenshuai.xi  *   Section information
309*53ee8cc1Swenshuai.xi  */
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi   struct {
312*53ee8cc1Swenshuai.xi     char x_scnlen[4];	/* section length */
313*53ee8cc1Swenshuai.xi     char x_nreloc[2];	/* # relocation entries */
314*53ee8cc1Swenshuai.xi     char x_nlinno[2];	/* # line numbers */
315*53ee8cc1Swenshuai.xi   } x_scn;
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi /*
318*53ee8cc1Swenshuai.xi  *   Transfer vector (branch table)
319*53ee8cc1Swenshuai.xi  */
320*53ee8cc1Swenshuai.xi 
321*53ee8cc1Swenshuai.xi   struct {
322*53ee8cc1Swenshuai.xi     char x_tvfill[4];	/* tv fill value */
323*53ee8cc1Swenshuai.xi     char x_tvlen[2];	/* length of .tv */
324*53ee8cc1Swenshuai.xi     char x_tvran[2][2];	/* tv range */
325*53ee8cc1Swenshuai.xi   } x_tv;		/* info about .tv section (in auxent of symbol .tv)) */
326*53ee8cc1Swenshuai.xi };
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi #define	COFF_SYMENT	struct COFF_syment
329*53ee8cc1Swenshuai.xi #define	COFF_SYMESZ	18
330*53ee8cc1Swenshuai.xi #define	COFF_AUXENT	union COFF_auxent
331*53ee8cc1Swenshuai.xi #define	COFF_AUXESZ	18
332*53ee8cc1Swenshuai.xi 
333*53ee8cc1Swenshuai.xi #define COFF_ETEXT	"etext"
334*53ee8cc1Swenshuai.xi 
335*53ee8cc1Swenshuai.xi /********************** RELOCATION DIRECTIVES **********************/
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi struct COFF_reloc {
338*53ee8cc1Swenshuai.xi   char r_vaddr[4];        /* Virtual address of item    */
339*53ee8cc1Swenshuai.xi   char r_symndx[4];       /* Symbol index in the symtab */
340*53ee8cc1Swenshuai.xi   char r_type[2];         /* Relocation type            */
341*53ee8cc1Swenshuai.xi };
342*53ee8cc1Swenshuai.xi 
343*53ee8cc1Swenshuai.xi #define COFF_RELOC struct COFF_reloc
344*53ee8cc1Swenshuai.xi #define COFF_RELSZ 10
345*53ee8cc1Swenshuai.xi 
346*53ee8cc1Swenshuai.xi #define COFF_DEF_DATA_SECTION_ALIGNMENT  4
347*53ee8cc1Swenshuai.xi #define COFF_DEF_BSS_SECTION_ALIGNMENT   4
348*53ee8cc1Swenshuai.xi #define COFF_DEF_TEXT_SECTION_ALIGNMENT  4
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi /* For new sections we haven't heard of before */
351*53ee8cc1Swenshuai.xi #define COFF_DEF_SECTION_ALIGNMENT       4
352