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