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