|
|
1.1 ! root 1: .TH A.OUT 5 ! 2: .CT 1 lib_obj ! 3: .SH NAME ! 4: a.out \- object file format ! 5: .SH SYNOPSIS ! 6: .B #include <a.out.h> ! 7: .SH DESCRIPTION ! 8: .I A.out ! 9: is the default name of the output file of the assembler ! 10: .IR as (1) ! 11: or the link editor ! 12: .IR ld (1). ! 13: Both programs make ! 14: .I a.out ! 15: executable if there were no ! 16: errors and no unresolved external references. ! 17: An object file has five sections: ! 18: a header, the program text and data, ! 19: relocation information, a symbol table and a string table (in that order). ! 20: The last three may be absent; see ! 21: .IR strip (1) ! 22: and option ! 23: .B -s ! 24: of ! 25: .IR ld (1). ! 26: The header format, given in ! 27: .BR <a.out.h> , ! 28: is ! 29: .PP ! 30: .EX ! 31: .ta \w'#define 'u +\w'unsigned 'u +\w'a_dirsize 'u +4n ! 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: #define OMAGIC 0407 /* old impure format */ ! 43: #define NMAGIC 0410 /* read-only text */ ! 44: #define ZMAGIC 0413 /* demand load format */ ! 45: .EE ! 46: .PP ! 47: Macros which take ! 48: .L exec ! 49: structures as arguments and tell whether ! 50: the file has a reasonable magic number or return offsets: ! 51: .EX ! 52: #define N_BADMAG(x) (((x).a_magic)!=OMAGIC && \e ! 53: ((x).a_magic)!=NMAGIC && ((x).a_magic)!=ZMAGIC) ! 54: #define N_TXTOFF(x) \e ! 55: ((x).a_magic==ZMAGIC ? 1024 : sizeof (struct exec)) ! 56: #define N_SYMOFF(x) (N_TXTOFF(x) + (x).a_text+(x).a_data + \e ! 57: (x).a_trsize+(x).a_drsize) ! 58: #define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) ! 59: .EE ! 60: .DT ! 61: .PP ! 62: Sizes are expressed in bytes. ! 63: The size of the header is not included in any of the other sizes. ! 64: .PP ! 65: When an ! 66: .F a.out ! 67: file is executed, a memory image of three segments is ! 68: set up: the text segment, the data segment, ! 69: and a stack. ! 70: The text segment begins at virtual address 0. ! 71: Following the text segment is the data segment, in which ! 72: explicitly initialized data come first, then ! 73: other data, initialized to 0. ! 74: The stack occupies the highest possible locations ! 75: in the core image, automatically growing downwards from ! 76: .lg 0 ! 77: .BR 0x7ffff400 ! 78: .lg 1 ! 79: as needed. ! 80: The data segment may be extended by ! 81: .IR brk (2). ! 82: .PP ! 83: If the magic number in the header is ! 84: .BR OMAGIC , ! 85: the text ! 86: segment is neither write-protected nor shared and ! 87: the data segment is immediately contiguous ! 88: with the text segment. ! 89: This kind of executable program is rarely used. ! 90: If the magic number is ! 91: .BR NMAGIC ! 92: or ! 93: .BR ZMAGIC , ! 94: the data segment is loaded at the first 0 mod 1024 address ! 95: following the text segment, ! 96: and the text segment is write-protected and shared among ! 97: all processes that are executing the same file. ! 98: .BR ZMAGIC ! 99: format, which ! 100: .IR ld (1) ! 101: produces by default, supports demand paging: the ! 102: text and data segments are multiples of ! 103: 1024 bytes long and begin at byte offsets of 0 mod 1024 ! 104: in the ! 105: .F a.out ! 106: file. ! 107: .PP ! 108: Macros are provided to compute the absolute offset of various ! 109: parts of the file: ! 110: .TF N_TXTOFF ! 111: .TP ! 112: .B N_TXTOFF ! 113: Text segment. ! 114: .TP ! 115: .B N_SYMOFF ! 116: Symbol table. ! 117: .TP ! 118: .B N_STROFF ! 119: String table. ! 120: .PD ! 121: .PP ! 122: The offsets of the data segment, text relocation information, ! 123: and data relocation information are obtained by successively ! 124: adding to ! 125: .B N_TXTOFF ! 126: the size fields ! 127: .BR a_text , ! 128: .BR a_data , ! 129: and ! 130: .BR a_trsize . ! 131: The first 4 bytes of the string table contain it size, including ! 132: the 4 bytes. ! 133: .PP ! 134: The layout of a symbol table entry, as given in ! 135: .BR <a.out.h> , ! 136: is ! 137: .PP ! 138: .EX ! 139: .ta \w'#define 'u +\w'char'u-1u +\w'unsigned 'u+1u +\w'*n_name 'u ! 140: struct nlist { ! 141: union { ! 142: char *n_name; /* for use when in-core */ ! 143: long n_strx; /* index into file string table */ ! 144: } n_un; ! 145: unsigned char n_type; /* type flag; see below */ ! 146: char n_other; ! 147: short n_desc; /* see \fIstab\fR(5)\f5 */ ! 148: unsigned n_value; /* value of this symbol (or struct offset) */ ! 149: }; ! 150: .EE ! 151: .PP ! 152: Basic values for ! 153: .BR n_type : ! 154: .PP ! 155: .EX ! 156: #define N_UNDF 0x0 /* undefined */ ! 157: #define N_ABS 0x2 /* absolute */ ! 158: #define N_TEXT 0x4 /* text */ ! 159: #define N_DATA 0x6 /* data */ ! 160: #define N_BSS 0x8 /* bss */ ! 161: #define N_COMM 0x12 /* common (internal to ld) */ ! 162: #define N_FN 0x1f /* file name symbol */ ! 163: #define N_EXT 01 /* external bit, or'ed in */ ! 164: #define N_TYPE 0x1e /* mask for all the type bits */ ! 165: .EE ! 166: .PP ! 167: Other permanent symbol table entries have some ! 168: .B N_STAB ! 169: bits set. ! 170: These are given in ! 171: .LR <stab.h> : ! 172: .EX ! 173: #define N_STAB 0xe0 /* if any of these bits set, keep */ ! 174: .EE ! 175: .DT ! 176: .PP ! 177: The field ! 178: .B n_un.n_strx ! 179: gives an index into the ! 180: string table; 0 ! 181: indicates that no name is associated ! 182: with the entry. ! 183: The field ! 184: .B n_un.n_name ! 185: can be used ! 186: to refer to the symbol name only if the program sets this up using ! 187: .B n_strx ! 188: and appropriate data from the string table. ! 189: .PP ! 190: A symbol of type undefined external with nonzero value field ! 191: names a common region; the value specifies its size. ! 192: .PP ! 193: Relocation ! 194: information occupies eight bytes per ! 195: relocatable datum: ! 196: .PP ! 197: .EX ! 198: .ta \w'#define 'u +\w'unsigned 'u +\w'r_symbolnum:24, 'u +4n ! 199: struct relocation_info { ! 200: int r_address; /* address of datum to be relocated */ ! 201: unsigned r_symbolnum:24, /* local symbol ordinal */ ! 202: r_pcrel:1, /* is referenced relative to pc */ ! 203: r_length:2, /* 0=byte, 1=word, 2=long */ ! 204: r_extern:1, /* symbol value unknown */ ! 205: :4; /* nothing, yet */ ! 206: }; ! 207: .EE ! 208: .DT ! 209: .PP ! 210: If ! 211: .B r_extern ! 212: is 1, the datum designated by ! 213: .B r_address ! 214: and ! 215: .B r_length ! 216: will be relocated by adding to it the value of the associated ! 217: external symbol. ! 218: If ! 219: .B r_extern ! 220: is 0, ! 221: .BR r_symbolnum ! 222: is encoded in the style of ! 223: .B n_type ! 224: and the value will be relocated by adding the relocated base of ! 225: the designated area (text, initialized data, or common data). ! 226: .SH "SEE ALSO" ! 227: .IR adb (1), ! 228: .IR as (1), ! 229: .IR ld (1), ! 230: .IR nm (1), ! 231: .IR stab (5), ! 232: .IR strip (1)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.