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