Annotation of cci/usr/src/man/man5/a.out.5, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.