Annotation of cci/usr/src/man/man5/a.out.5, revision 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.