xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/linux/a.out.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi #ifndef __A_OUT_GNU_H__
2*53ee8cc1Swenshuai.xi #define __A_OUT_GNU_H__
3*53ee8cc1Swenshuai.xi 
4*53ee8cc1Swenshuai.xi #define __GNU_EXEC_MACROS__
5*53ee8cc1Swenshuai.xi 
6*53ee8cc1Swenshuai.xi #ifndef __STRUCT_EXEC_OVERRIDE__
7*53ee8cc1Swenshuai.xi 
8*53ee8cc1Swenshuai.xi #include <asm/a.out.h>
9*53ee8cc1Swenshuai.xi 
10*53ee8cc1Swenshuai.xi #endif /* __STRUCT_EXEC_OVERRIDE__ */
11*53ee8cc1Swenshuai.xi 
12*53ee8cc1Swenshuai.xi #ifndef __ASSEMBLY__
13*53ee8cc1Swenshuai.xi 
14*53ee8cc1Swenshuai.xi /* these go in the N_MACHTYPE field */
15*53ee8cc1Swenshuai.xi enum machine_type {
16*53ee8cc1Swenshuai.xi #if defined (M_OLDSUN2)
17*53ee8cc1Swenshuai.xi   M__OLDSUN2 = M_OLDSUN2,
18*53ee8cc1Swenshuai.xi #else
19*53ee8cc1Swenshuai.xi   M_OLDSUN2 = 0,
20*53ee8cc1Swenshuai.xi #endif
21*53ee8cc1Swenshuai.xi #if defined (M_68010)
22*53ee8cc1Swenshuai.xi   M__68010 = M_68010,
23*53ee8cc1Swenshuai.xi #else
24*53ee8cc1Swenshuai.xi   M_68010 = 1,
25*53ee8cc1Swenshuai.xi #endif
26*53ee8cc1Swenshuai.xi #if defined (M_68020)
27*53ee8cc1Swenshuai.xi   M__68020 = M_68020,
28*53ee8cc1Swenshuai.xi #else
29*53ee8cc1Swenshuai.xi   M_68020 = 2,
30*53ee8cc1Swenshuai.xi #endif
31*53ee8cc1Swenshuai.xi #if defined (M_SPARC)
32*53ee8cc1Swenshuai.xi   M__SPARC = M_SPARC,
33*53ee8cc1Swenshuai.xi #else
34*53ee8cc1Swenshuai.xi   M_SPARC = 3,
35*53ee8cc1Swenshuai.xi #endif
36*53ee8cc1Swenshuai.xi   /* skip a bunch so we don't run into any of sun's numbers */
37*53ee8cc1Swenshuai.xi   M_386 = 100,
38*53ee8cc1Swenshuai.xi   M_MIPS1 = 151,	/* MIPS R3000/R3000 binary */
39*53ee8cc1Swenshuai.xi   M_MIPS2 = 152		/* MIPS R6000/R4000 binary */
40*53ee8cc1Swenshuai.xi };
41*53ee8cc1Swenshuai.xi 
42*53ee8cc1Swenshuai.xi #if !defined (N_MAGIC)
43*53ee8cc1Swenshuai.xi #define N_MAGIC(exec) ((exec).a_info & 0xffff)
44*53ee8cc1Swenshuai.xi #endif
45*53ee8cc1Swenshuai.xi #define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff))
46*53ee8cc1Swenshuai.xi #define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff)
47*53ee8cc1Swenshuai.xi #define N_SET_INFO(exec, magic, type, flags) \
48*53ee8cc1Swenshuai.xi 	((exec).a_info = ((magic) & 0xffff) \
49*53ee8cc1Swenshuai.xi 	 | (((int)(type) & 0xff) << 16) \
50*53ee8cc1Swenshuai.xi 	 | (((flags) & 0xff) << 24))
51*53ee8cc1Swenshuai.xi #define N_SET_MAGIC(exec, magic) \
52*53ee8cc1Swenshuai.xi 	((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff)))
53*53ee8cc1Swenshuai.xi 
54*53ee8cc1Swenshuai.xi #define N_SET_MACHTYPE(exec, machtype) \
55*53ee8cc1Swenshuai.xi 	((exec).a_info = \
56*53ee8cc1Swenshuai.xi 	 ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16))
57*53ee8cc1Swenshuai.xi 
58*53ee8cc1Swenshuai.xi #define N_SET_FLAGS(exec, flags) \
59*53ee8cc1Swenshuai.xi 	((exec).a_info = \
60*53ee8cc1Swenshuai.xi 	 ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24))
61*53ee8cc1Swenshuai.xi 
62*53ee8cc1Swenshuai.xi /* Code indicating object file or impure executable.  */
63*53ee8cc1Swenshuai.xi #define OMAGIC 0407
64*53ee8cc1Swenshuai.xi /* Code indicating pure executable.  */
65*53ee8cc1Swenshuai.xi #define NMAGIC 0410
66*53ee8cc1Swenshuai.xi /* Code indicating demand-paged executable.  */
67*53ee8cc1Swenshuai.xi #define ZMAGIC 0413
68*53ee8cc1Swenshuai.xi /* This indicates a demand-paged executable with the header in the text.
69*53ee8cc1Swenshuai.xi    The first page is unmapped to help trap NULL pointer references */
70*53ee8cc1Swenshuai.xi #define QMAGIC 0314
71*53ee8cc1Swenshuai.xi 
72*53ee8cc1Swenshuai.xi /* Code indicating core file.  */
73*53ee8cc1Swenshuai.xi #define CMAGIC 0421
74*53ee8cc1Swenshuai.xi 
75*53ee8cc1Swenshuai.xi #if !defined (N_BADMAG)
76*53ee8cc1Swenshuai.xi #define N_BADMAG(x)	  (N_MAGIC(x) != OMAGIC		\
77*53ee8cc1Swenshuai.xi 			&& N_MAGIC(x) != NMAGIC		\
78*53ee8cc1Swenshuai.xi   			&& N_MAGIC(x) != ZMAGIC \
79*53ee8cc1Swenshuai.xi 		        && N_MAGIC(x) != QMAGIC)
80*53ee8cc1Swenshuai.xi #endif
81*53ee8cc1Swenshuai.xi 
82*53ee8cc1Swenshuai.xi #define _N_HDROFF(x) (1024 - sizeof (struct exec))
83*53ee8cc1Swenshuai.xi 
84*53ee8cc1Swenshuai.xi #if !defined (N_TXTOFF)
85*53ee8cc1Swenshuai.xi #define N_TXTOFF(x) \
86*53ee8cc1Swenshuai.xi  (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : \
87*53ee8cc1Swenshuai.xi   (N_MAGIC(x) == QMAGIC ? 0 : sizeof (struct exec)))
88*53ee8cc1Swenshuai.xi #endif
89*53ee8cc1Swenshuai.xi 
90*53ee8cc1Swenshuai.xi #if !defined (N_DATOFF)
91*53ee8cc1Swenshuai.xi #define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text)
92*53ee8cc1Swenshuai.xi #endif
93*53ee8cc1Swenshuai.xi 
94*53ee8cc1Swenshuai.xi #if !defined (N_TRELOFF)
95*53ee8cc1Swenshuai.xi #define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data)
96*53ee8cc1Swenshuai.xi #endif
97*53ee8cc1Swenshuai.xi 
98*53ee8cc1Swenshuai.xi #if !defined (N_DRELOFF)
99*53ee8cc1Swenshuai.xi #define N_DRELOFF(x) (N_TRELOFF(x) + N_TRSIZE(x))
100*53ee8cc1Swenshuai.xi #endif
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi #if !defined (N_SYMOFF)
103*53ee8cc1Swenshuai.xi #define N_SYMOFF(x) (N_DRELOFF(x) + N_DRSIZE(x))
104*53ee8cc1Swenshuai.xi #endif
105*53ee8cc1Swenshuai.xi 
106*53ee8cc1Swenshuai.xi #if !defined (N_STROFF)
107*53ee8cc1Swenshuai.xi #define N_STROFF(x) (N_SYMOFF(x) + N_SYMSIZE(x))
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi /* Address of text segment in memory after it is loaded.  */
111*53ee8cc1Swenshuai.xi #if !defined (N_TXTADDR)
112*53ee8cc1Swenshuai.xi #define N_TXTADDR(x) (N_MAGIC(x) == QMAGIC ? PAGE_SIZE : 0)
113*53ee8cc1Swenshuai.xi #endif
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi /* Address of data segment in memory after it is loaded.
116*53ee8cc1Swenshuai.xi    Note that it is up to you to define SEGMENT_SIZE
117*53ee8cc1Swenshuai.xi    on machines not listed here.  */
118*53ee8cc1Swenshuai.xi #if defined(vax) || defined(hp300) || defined(pyr)
119*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE page_size
120*53ee8cc1Swenshuai.xi #endif
121*53ee8cc1Swenshuai.xi #ifdef	sony
122*53ee8cc1Swenshuai.xi #define	SEGMENT_SIZE	0x2000
123*53ee8cc1Swenshuai.xi #endif	/* Sony.  */
124*53ee8cc1Swenshuai.xi #ifdef is68k
125*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE 0x20000
126*53ee8cc1Swenshuai.xi #endif
127*53ee8cc1Swenshuai.xi #if defined(m68k) && defined(PORTAR)
128*53ee8cc1Swenshuai.xi #define PAGE_SIZE 0x400
129*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE PAGE_SIZE
130*53ee8cc1Swenshuai.xi #endif
131*53ee8cc1Swenshuai.xi 
132*53ee8cc1Swenshuai.xi #include <unistd.h>
133*53ee8cc1Swenshuai.xi #if defined(__i386__) || defined(__mc68000__)
134*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE	1024
135*53ee8cc1Swenshuai.xi #else
136*53ee8cc1Swenshuai.xi #ifndef SEGMENT_SIZE
137*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE   getpagesize()
138*53ee8cc1Swenshuai.xi #endif
139*53ee8cc1Swenshuai.xi #endif
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi #define _N_SEGMENT_ROUND(x) ALIGN(x, SEGMENT_SIZE)
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi #define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text)
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi #ifndef N_DATADDR
146*53ee8cc1Swenshuai.xi #define N_DATADDR(x) \
147*53ee8cc1Swenshuai.xi     (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \
148*53ee8cc1Swenshuai.xi      : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x))))
149*53ee8cc1Swenshuai.xi #endif
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi /* Address of bss segment in memory after it is loaded.  */
152*53ee8cc1Swenshuai.xi #if !defined (N_BSSADDR)
153*53ee8cc1Swenshuai.xi #define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data)
154*53ee8cc1Swenshuai.xi #endif
155*53ee8cc1Swenshuai.xi 
156*53ee8cc1Swenshuai.xi #if !defined (N_NLIST_DECLARED)
157*53ee8cc1Swenshuai.xi struct nlist {
158*53ee8cc1Swenshuai.xi   union {
159*53ee8cc1Swenshuai.xi     char *n_name;
160*53ee8cc1Swenshuai.xi     struct nlist *n_next;
161*53ee8cc1Swenshuai.xi     long n_strx;
162*53ee8cc1Swenshuai.xi   } n_un;
163*53ee8cc1Swenshuai.xi   unsigned char n_type;
164*53ee8cc1Swenshuai.xi   char n_other;
165*53ee8cc1Swenshuai.xi   short n_desc;
166*53ee8cc1Swenshuai.xi   unsigned long n_value;
167*53ee8cc1Swenshuai.xi };
168*53ee8cc1Swenshuai.xi #endif /* no N_NLIST_DECLARED.  */
169*53ee8cc1Swenshuai.xi 
170*53ee8cc1Swenshuai.xi #if !defined (N_UNDF)
171*53ee8cc1Swenshuai.xi #define N_UNDF 0
172*53ee8cc1Swenshuai.xi #endif
173*53ee8cc1Swenshuai.xi #if !defined (N_ABS)
174*53ee8cc1Swenshuai.xi #define N_ABS 2
175*53ee8cc1Swenshuai.xi #endif
176*53ee8cc1Swenshuai.xi #if !defined (N_TEXT)
177*53ee8cc1Swenshuai.xi #define N_TEXT 4
178*53ee8cc1Swenshuai.xi #endif
179*53ee8cc1Swenshuai.xi #if !defined (N_DATA)
180*53ee8cc1Swenshuai.xi #define N_DATA 6
181*53ee8cc1Swenshuai.xi #endif
182*53ee8cc1Swenshuai.xi #if !defined (N_BSS)
183*53ee8cc1Swenshuai.xi #define N_BSS 8
184*53ee8cc1Swenshuai.xi #endif
185*53ee8cc1Swenshuai.xi #if !defined (N_FN)
186*53ee8cc1Swenshuai.xi #define N_FN 15
187*53ee8cc1Swenshuai.xi #endif
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi #if !defined (N_EXT)
190*53ee8cc1Swenshuai.xi #define N_EXT 1
191*53ee8cc1Swenshuai.xi #endif
192*53ee8cc1Swenshuai.xi #if !defined (N_TYPE)
193*53ee8cc1Swenshuai.xi #define N_TYPE 036
194*53ee8cc1Swenshuai.xi #endif
195*53ee8cc1Swenshuai.xi #if !defined (N_STAB)
196*53ee8cc1Swenshuai.xi #define N_STAB 0340
197*53ee8cc1Swenshuai.xi #endif
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi /* The following type indicates the definition of a symbol as being
200*53ee8cc1Swenshuai.xi    an indirect reference to another symbol.  The other symbol
201*53ee8cc1Swenshuai.xi    appears as an undefined reference, immediately following this symbol.
202*53ee8cc1Swenshuai.xi 
203*53ee8cc1Swenshuai.xi    Indirection is asymmetrical.  The other symbol's value will be used
204*53ee8cc1Swenshuai.xi    to satisfy requests for the indirect symbol, but not vice versa.
205*53ee8cc1Swenshuai.xi    If the other symbol does not have a definition, libraries will
206*53ee8cc1Swenshuai.xi    be searched to find a definition.  */
207*53ee8cc1Swenshuai.xi #define N_INDR 0xa
208*53ee8cc1Swenshuai.xi 
209*53ee8cc1Swenshuai.xi /* The following symbols refer to set elements.
210*53ee8cc1Swenshuai.xi    All the N_SET[ATDB] symbols with the same name form one set.
211*53ee8cc1Swenshuai.xi    Space is allocated for the set in the text section, and each set
212*53ee8cc1Swenshuai.xi    element's value is stored into one word of the space.
213*53ee8cc1Swenshuai.xi    The first word of the space is the length of the set (number of elements).
214*53ee8cc1Swenshuai.xi 
215*53ee8cc1Swenshuai.xi    The address of the set is made into an N_SETV symbol
216*53ee8cc1Swenshuai.xi    whose name is the same as the name of the set.
217*53ee8cc1Swenshuai.xi    This symbol acts like a N_DATA global symbol
218*53ee8cc1Swenshuai.xi    in that it can satisfy undefined external references.  */
219*53ee8cc1Swenshuai.xi 
220*53ee8cc1Swenshuai.xi /* These appear as input to LD, in a .o file.  */
221*53ee8cc1Swenshuai.xi #define	N_SETA	0x14		/* Absolute set element symbol */
222*53ee8cc1Swenshuai.xi #define	N_SETT	0x16		/* Text set element symbol */
223*53ee8cc1Swenshuai.xi #define	N_SETD	0x18		/* Data set element symbol */
224*53ee8cc1Swenshuai.xi #define	N_SETB	0x1A		/* Bss set element symbol */
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi /* This is output from LD.  */
227*53ee8cc1Swenshuai.xi #define N_SETV	0x1C		/* Pointer to set vector in data area.  */
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi #if !defined (N_RELOCATION_INFO_DECLARED)
230*53ee8cc1Swenshuai.xi /* This structure describes a single relocation to be performed.
231*53ee8cc1Swenshuai.xi    The text-relocation section of the file is a vector of these structures,
232*53ee8cc1Swenshuai.xi    all of which apply to the text section.
233*53ee8cc1Swenshuai.xi    Likewise, the data-relocation section applies to the data section.  */
234*53ee8cc1Swenshuai.xi 
235*53ee8cc1Swenshuai.xi struct relocation_info
236*53ee8cc1Swenshuai.xi {
237*53ee8cc1Swenshuai.xi   /* Address (within segment) to be relocated.  */
238*53ee8cc1Swenshuai.xi   int r_address;
239*53ee8cc1Swenshuai.xi   /* The meaning of r_symbolnum depends on r_extern.  */
240*53ee8cc1Swenshuai.xi   unsigned int r_symbolnum:24;
241*53ee8cc1Swenshuai.xi   /* Nonzero means value is a pc-relative offset
242*53ee8cc1Swenshuai.xi      and it should be relocated for changes in its own address
243*53ee8cc1Swenshuai.xi      as well as for changes in the symbol or section specified.  */
244*53ee8cc1Swenshuai.xi   unsigned int r_pcrel:1;
245*53ee8cc1Swenshuai.xi   /* Length (as exponent of 2) of the field to be relocated.
246*53ee8cc1Swenshuai.xi      Thus, a value of 2 indicates 1<<2 bytes.  */
247*53ee8cc1Swenshuai.xi   unsigned int r_length:2;
248*53ee8cc1Swenshuai.xi   /* 1 => relocate with value of symbol.
249*53ee8cc1Swenshuai.xi           r_symbolnum is the index of the symbol
250*53ee8cc1Swenshuai.xi 	  in file's the symbol table.
251*53ee8cc1Swenshuai.xi      0 => relocate with the address of a segment.
252*53ee8cc1Swenshuai.xi           r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS
253*53ee8cc1Swenshuai.xi 	  (the N_EXT bit may be set also, but signifies nothing).  */
254*53ee8cc1Swenshuai.xi   unsigned int r_extern:1;
255*53ee8cc1Swenshuai.xi   /* Four bits that aren't used, but when writing an object file
256*53ee8cc1Swenshuai.xi      it is desirable to clear them.  */
257*53ee8cc1Swenshuai.xi #ifdef NS32K
258*53ee8cc1Swenshuai.xi   unsigned r_bsr:1;
259*53ee8cc1Swenshuai.xi   unsigned r_disp:1;
260*53ee8cc1Swenshuai.xi   unsigned r_pad:2;
261*53ee8cc1Swenshuai.xi #else
262*53ee8cc1Swenshuai.xi   unsigned int r_pad:4;
263*53ee8cc1Swenshuai.xi #endif
264*53ee8cc1Swenshuai.xi };
265*53ee8cc1Swenshuai.xi #endif /* no N_RELOCATION_INFO_DECLARED.  */
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi #endif /*__ASSEMBLY__ */
268*53ee8cc1Swenshuai.xi #endif /* __A_OUT_GNU_H__ */
269