Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ a_out(F) — OpenDesktop 1.0.0y

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

as(CP)

cc(CP)

ld(CP)

brk(S)

filehdr(F)

ldfcn(F)

linenum(F)

reloc(F)

scnhdr(F)

syms(F)

A.OUT(F)


     A.OUT(F)                                   UNIX System V


     Name
          a.out - UNIX common assembler and link editor output


     Syntax
          #include <a.out.h>


     Description
          The file name a.out is the default output file name from the
          link  editor  ld(CP).   The  link  editor  will  make  a.out
          executable if there were no errors in linking.   The  output
          file  of  the UNIX assembler as (CP) also follows the common
          object file format of the a.out file  although  the  default
          file name is different.

          A common object file consists  of  a  file  header,  a  UNIX
          system  header  (if the file is link editor output), a table
          of section headers, relocation information, (optional)  line
          numbers,  a  symbol table, and a string table.  The order is
          given below.

                    File header.
                    UNIX system header.
                    Section 1 header.
                    ...
                    Section n header.
                    Section 1 data.
                    ...
                    Section n data.
                    Section 1 relocation.
                    ...
                    Section n relocation.
                    Section 1 line numbers.
                    ...
                    Section n line numbers.
                    Symbol table.
                    String table.

          The last three parts of an object file (line numbers, symbol
          table  and  string  table) may be missing if the program was
          linked with the -s option of ld(CP) or if they were  removed
          by  strip(CP).   Also  note  that the relocation information
          will be absent after linking unless the -r option of  ld(CP)
          was  used.  The string table exists only if the symbol table
          contains symbols with names longer than eight characters.

          The  sizes  of  each  section  (contained  in  the   header,
          discussed below) are in bytes.

          When an a.out file is  loaded  into  memory  for  execution,
          three  logical  segments  are  set up: the text segment, the
          data segment (initialized data  followed  by  uninitialized,
          the  latter  actually  being  initialized to all 0's), and a
          stack.   On  your  computer,  the  text  segment  starts  at
          location virtual address 0.


          The a.out file produced by ld(CP) may have one of two  magic
          numbers  in  the  first  field of the UNIX system header.  A
          magic number of 0410 indicates that the executable  must  be
          swapped  through  the  private  swapping  store  of the UNIX
          system, while the magic number 0413  causes  the  system  to
          attempt to page the text directly from the a.out file.

          In a 0410 executable, the text section is loaded at  virtual
          location 0x00000000.  The data section is loaded immediately
          following the end of the text section.

          For a 0413 executable, the headers (file header, UNIX system
          header,  and section headers) are loaded at the beginning of
          the text  segment  and  the  text  immediately  follows  the
          headers  in  the user address space.  The first text address
          will equal the sum of the sizes of  the  headers,  and  will
          vary  depending on the number of sections in the a.out file.
          In an a.out file with 3 sections (.text,  .data,  and  .bss)
          the  first  text address is at 0x000000D0.  The data section
          starts in the next page table directory after the  last  one
          used  by  the  text  section,  in  the  first  page  of that
          directory, with an offset into that page equal  to  the  1st
          unused  memory  offset in the last page of text.  That is to
          say, given that etext is the address of the last byte of the
          text  section,  the  1st byte of the data section will be at
          0x00400000  +  (etext   &   0xFFC00000)   +   ((etext+1)   &
          0xFFC00FFF).

          On the 80386 computer the stack begins at location  7FFFFFFC
          and   grows   toward   lower   addresses.    The   stack  is
          automatically extended as required.   The  data  segment  is
          extended only as requested by the brk(S) system call.

          For relocatable files the value of a word  in  the  text  or
          data  portions  that  is  not  a  reference  to an undefined
          external symbol is exactly the value  that  will  appear  in
          memory  when  the  file  is executed.  If a word in the text
          involves a reference to an undefined external symbol,  there
          will  be  a relocation entry for the word, the storage class
          of the symbol-table entry for the symbol will be  marked  as
          an  ``external symbol'', and the value and section number of
          the symbol-table entry will be undefined.  When the file  is
          processed by the link editor and the external symbol becomes
          defined, the value of the symbol will be added to  the  word
          in the file.

        File Header
          The format of the filehdr header is:

          struct filehdr
          {
                  unsigned short  f_magic;   /* magic number */
                  unsigned short  f_nscns;   /* number of sections */
                  long            f_timdat;  /* time and date stamp */
                  long            f_symptr;  /* file ptr to symtab */
                  long            f_nsyms;   /* # symtab entries */
                  unsigned short  f_opthdr;  /* sizeof(opt hdr) */
                  unsigned short  f_flags;   /* flags */
          };

        UNIX System Header
          The format of the UNIX system header is:

          typedef struct aouthdr
          {
                  short   magic;      /* magic number */
                  short   vstamp;     /* version stamp */
                  long    tsize;      /* text size in bytes, padded */
                  long    dsize;      /* initialized data (.data) */
                  long    bsize;      /* uninitialized data (.bss) */
                  long    entry;      /* entry point */
                  long    text_start; /* base of text used for this file */
                  long    data_start; /* base of data used for this file */
          } AOUTHDR;

        Section Header
          The format of the section header is:

          struct scnhdr
          {
                  char            s_name[SYMNMLEN];/* section name */
                  long            s_paddr;    /* physical address */
                  long            s_vaddr;    /* virtual address */
                  long            s_size;     /* section size */
                  long            s_scnptr;   /* file ptr to raw data */
                  long            s_relptr;   /* file ptr to relocation */
                  long            s_lnnoptr;  /* file ptr to line numbers */
                  unsigned short  s_nreloc;   /* # reloc entries */
                  unsigned short  s_nlnno;    /* # line number entries */
                  long            s_flags;    /* flags */
          };

        Relocation
          Object files have one relocation entry for each  relocatable
          reference in the text or data.  If relocation information is
          present, it will be in the following format:

          struct reloc
          {
                   long      r_vaddr;   /* (virtual) address of reference */
                   long      r_symndx;  /* index into symbol table */
                   ushort    r_type;    /* relocation type */
          };

          The start of the relocation information is s_relptr from the
          section  header.   If  there  is  no relocation information,
          s_relptr is 0.

        Symbol Table
          The format of each symbol in the symbol table is

          #define  SYMNMLEN  8
          #define  FILNMLEN  14
          #define  DIMNUM    4

          struct syment
          {
              union                       /* all ways to get a symbol name */
              {
                  char        _n_name[SYMNMLEN]; /* name of symbol */
                  struct
                  {
                      long    _n_zeroes;    /* == 0L if in string table */
                      long    _n_offset;    /* location in string table */
                  } _n_n;
                  char        *_n_nptr[2];  /* allows overlaying */
              } _n;
              long            n_value;      /* value of symbol */
              short           n_scnum;      /* section number */
              unsigned short  n_type;       /* type and derived type */
              char            n_sclass;     /* storage class */
              char            n_numaux;     /* number of aux entries */
          };

          #define  n_name    _n._n_name
          #define  n_zeroes  _n._n_n._n_zeroes
          #define  n_offset  _n._n_n._n_offset
          #define  n_nptr    _n._n_nptr[1]

          Some symbols require more information than a  single  entry;
          they  are  followed  by  auxiliary entries that are the same
          size as a symbol entry.  The format follows.

          union auxent {
                 struct {
                        long   x_tagndx;
                        union {
                               struct {
                                        unsigned short  x_lnno;
                                        unsigned short  x_size;
                               } x_lnsz;
                               long     x_fsize;
                        } x_misc;
                        union {
                               struct {
                                        long   x_lnnoptr;
                                        long   x_endndx;
                               }  x_fcn;
                               struct {
                                        unsigned short  x_dimen[DIMNUM];
                               } x_ary;
                        } x_fcnary;
                        unsigned short  x_tvndx;
                 } x_sym;

                 struct {
                        char   x_fname[FILNMLEN];
                 } x_file;

                 struct {
                        long       x_scnlen;
                        unsigned short  x_nreloc;
                        unsigned short  x_nlinno;
                 } x_scn;

                 struct {
                        long            x_tvfill;
                        unsigned short  x_tvlen;
                        unsigned short  x_tvran[2];
                 } x_tv;
          };

          Indexes of symbol table entries begin at zero.  The start of
          the  symbol  table  is f_symptr (from the file header) bytes
          from the beginning of the file.   If  the  symbol  table  is
          stripped,  f_symptr  is 0.  The string table (if one exists)
          begins at f_symptr +  (f_nsyms  *  SYMESZ)  bytes  from  the
          beginning of the file.


     See Also
          as(CP),  cc(CP),  ld(CP),  brk(S).   filehdr(F),   ldfcn(F),
          linenum(F), reloc(F), scnhdr(F), syms(F).


     (printed 8/23/89)                                  A.OUT(F)

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026