|
|
1.1 root 1: .\" Copyright (c) 1980 Regents of the University of California.
2: .\" All rights reserved. The Berkeley software License Agreement
3: .\" specifies the terms and conditions for redistribution.
4: .\"
5: .\" @(#)a.out.5 6.2 (Berkeley) 5/19/86
6: .\"
7: .TH A.OUT 5 "May 19, 1986"
8: .UC 4
9: .SH NAME
10: a.out \- assembler and link editor output
11: .SH SYNOPSIS
12: .B #include <a.out.h>
13: .SH DESCRIPTION
14: .I A.out
15: is the output file of the assembler
16: .IR as (1)
17: and the link editor
18: .IR ld (1).
19: Both programs make
20: .I a.out
21: executable if there were no
22: errors and no unresolved external references.
23: Layout information as given in the include file for the VAX-11 is:
24: .nf
25: .ta \w'#define 'u +\w'unsigned 'u +\w'a_dirsize 'u +4n
26: .PP
27: /*
28: .ti +\w'/'u
29: * Header prepended to each a.out file.
30: .ti +\w'/'u
31: */
32: struct exec {
33: long a_magic; /* magic number */
34: unsigned a_text; /* size of text segment */
35: unsigned a_data; /* size of initialized data */
36: unsigned a_bss; /* size of uninitialized data */
37: unsigned a_syms; /* size of symbol table */
38: unsigned a_entry; /* entry point */
39: unsigned a_trsize; /* size of text relocation */
40: unsigned a_drsize; /* size of data relocation */
41: };
42:
43: #define OMAGIC 0407 /* old impure format */
44: #define NMAGIC 0410 /* read-only text */
45: #define ZMAGIC 0413 /* demand load format */
46:
47: /*
48: .ti +\w'/'u
49: * Macros which take exec structures as arguments and tell whether
50: .ti +\w'/'u
51: * the file has a reasonable magic number or offsets to text\||\|symbols\||\|strings.
52: .ti +\w'/'u
53: */
54: #define N_BADMAG(x) \e
55: (((x).a_magic)!=OMAGIC && ((x).a_magic)!=NMAGIC && ((x).a_magic)!=ZMAGIC)
56:
57: #define N_TXTOFF(x) \e
58: ((x).a_magic==ZMAGIC ? 1024 : sizeof (struct exec))
59: #define N_SYMOFF(x) \e
60: (N_TXTOFF(x) + (x).a_text+(x).a_data + (x).a_trsize+(x).a_drsize)
61: #define N_STROFF(x) \e
62: (N_SYMOFF(x) + (x).a_syms)
63: .DT
64: .fi
65: .PP
66: The file has five sections:
67: a header, the program text and data,
68: relocation information, a symbol table and a string table (in that order).
69: The last three may be omitted
70: if the program was loaded
71: with the `\-s' option
72: of
73: .I ld
74: or if the symbols and relocation have been
75: removed by
76: .IR strip (1).
77: .PP
78: In the header the sizes of each section are given in bytes.
79: The size of the header is not included in any of the other sizes.
80: .PP
81: When an
82: .I a.out
83: file is executed, three logical segments are
84: set up: the text segment, the data segment
85: (with uninitialized data, which starts off as all 0, following
86: initialized),
87: and a stack.
88: The text segment begins at 0
89: in the core image; the header is not loaded.
90: If the magic number in the header is OMAGIC (0407),
91: it indicates that the text
92: segment is not to be write-protected and shared,
93: so the data segment is immediately contiguous
94: with the text segment.
95: This is the oldest kind of executable program and is rarely used.
96: If the magic number is NMAGIC (0410) or ZMAGIC (0413),
97: the data segment begins at the first 0 mod 1024 byte
98: boundary following the text segment,
99: and the text segment is not writable by the program;
100: if other processes are executing the same file,
101: they will share the text segment.
102: For ZMAGIC format, the text segment begins at a 0 mod 1024 byte boundary
103: in the
104: .I a.out
105: file, the remaining bytes after the header in the first block are
106: reserved and should be zero.
107: In this case the text and data sizes must both be multiples of 1024 bytes,
108: and the pages of the file will be brought into the running image as needed,
109: and not pre-loaded as with the other formats. This is especially suitable
110: for very large programs and is the default format produced by
111: .IR ld (1).
112: .PP
113: The stack will occupy the highest possible locations
114: in the core image, growing downwards from USRSTACK (from
115: .IR <machine/vmparam.h> ).
116: The stack is automatically extended as required.
117: The data segment is only extended as requested by
118: .IR brk (2).
119: .PP
120: After the header in the file follow the text, data, text relocation
121: data relocation, symbol table and string table in that order.
122: The text begins at the byte 1024 in the file for ZMAGIC format or just
123: after the header for the other formats. The N_TXTOFF macro returns
124: this absolute file position when given the name of an exec structure
125: as argument. The data segment is contiguous with the text and immediately
126: followed by the text relocation and then the data relocation information.
127: The symbol table follows all this; its position is computed by the
128: N_SYMOFF macro. Finally, the string table immediately follows the
129: symbol table at a position which can be gotten easily using N_STROFF.
130: The first 4 bytes of the string table are not used for string storage,
131: but rather contain the size of the string table; this size INCLUDES
132: the 4 bytes, the minimum string table size is thus 4.
133: .PP
134: The layout of a symbol table entry and the principal flag values
135: that distinguish symbol types are given in the include file as follows:
136: .PP
137: .nf
138: .ta \w'#define 'u +\w'char'u-1u +\w'unsigned 'u+1u +\w'*n_name 'u
139: /*
140: .ti +\w'/'u
141: * Format of a symbol table entry.
142: .ti +\w'/'u
143: */
144: struct nlist {
145: union {
146: char *n_name; /* for use when in-core */
147: long n_strx; /* index into file string table */
148: } n_un;
149: unsigned char n_type; /* type flag, i.e. N_TEXT etc; see below */
150: char n_other;
151: short n_desc; /* see <stab.h> */
152: unsigned n_value; /* value of this symbol (or offset) */
153: };
154: #define n_hash n_desc /* used internally by ld */
155:
156: /*
157: .ti +\w'/'u
158: * Simple values for n_type.
159: .ti +\w'/'u
160: */
161: #define N_UNDF 0x0 /* undefined */
162: #define N_ABS 0x2 /* absolute */
163: #define N_TEXT 0x4 /* text */
164: #define N_DATA 0x6 /* data */
165: #define N_BSS 0x8 /* bss */
166: #define N_COMM 0x12 /* common (internal to ld) */
167: #define N_FN 0x1f /* file name symbol */
168:
169: #define N_EXT 01 /* external bit, or'ed in */
170: #define N_TYPE 0x1e /* mask for all the type bits */
171:
172: /*
173: .ti +\w'/'u
174: * Other permanent symbol table entries have some of the N_STAB bits set.
175: .ti +\w'/'u
176: * These are given in <stab.h>
177: .ti +\w'/'u
178: */
179: #define N_STAB 0xe0 /* if any of these bits set, don't discard */
180:
181: /*
182: .ti +\w'/'u
183: * Format for namelist values.
184: .ti +\w'/'u
185: */
186: #define N_FORMAT "%08x"
187: .fi
188: .DT
189: .PP
190: In the
191: .I a.out
192: file a symbol's n_un.n_strx field gives an index into the
193: string table. A n_strx value of 0 indicates that no name is associated
194: with a particular symbol table entry. The field n_un.n_name can be used
195: to refer to the symbol name only if the program sets this up using
196: n_strx and appropriate data from the string table.
197: .PP
198: If a symbol's type is undefined external,
199: and the value field is non-zero,
200: the symbol is interpreted by the loader
201: .I ld
202: as
203: the name of a common region
204: whose size is indicated by the value of the
205: symbol.
206: .PP
207: The value of a byte in the text or data which is not
208: a portion of a reference to an undefined external symbol
209: is exactly that value which will appear in memory
210: when the file is executed.
211: If a byte in the text or data
212: involves a reference to an undefined external symbol,
213: as indicated by the relocation information,
214: then the value stored in the file
215: is an offset from the associated external symbol.
216: When the file is processed by the
217: link editor and the external symbol becomes
218: defined, the value of the symbol will
219: be added to the bytes in the file.
220: .PP
221: If relocation
222: information is present, it amounts to eight bytes per
223: relocatable datum as in the following structure:
224: .PP
225: .nf
226: .ta \w'#define 'u +\w'unsigned 'u +\w'r_symbolnum:24, 'u +4n
227: /*
228: .ti +\w'/'u
229: * Format of a relocation datum.
230: .ti +\w'/'u
231: */
232: struct relocation_info {
233: int r_address; /* address which is relocated */
234: unsigned r_symbolnum:24, /* local symbol ordinal */
235: r_pcrel:1, /* was relocated pc relative already */
236: r_length:2, /* 0=byte, 1=word, 2=long */
237: r_extern:1, /* does not include value of sym referenced */
238: :4; /* nothing, yet */
239: };
240: .fi
241: .DT
242: .PP
243: There is no relocation information if a_trsize+a_drsize==0.
244: If r_extern is 0, then r_symbolnum is actually a n_type for the relocation
245: (i.e. N_TEXT meaning relative to segment text origin.)
246: .fi
247: .SH "SEE ALSO"
248: adb(1), as(1), ld(1), nm(1), dbx(1), stab(5), strip(1)
249: .SH BUGS
250: Not having the size of the string table in the header is a loss, but
251: expanding the header size would have meant stripped executable file
252: incompatibility, and we couldn't hack this just now.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.