NAME
       lit - link editor for transputers

SYNOPSIS
       lit [options] [FILE ...]

DESCRIPTION
       lit combines several LIT format object files and libraries
       into a single LIT format executable.

OPTIONS
       --help show usage summary


       -o FILE, --output FILE
              output to FILE instead of a.out.

       -p N, --maxpasses N
              limit the number of offset optimization  passes  by
              N.   lit  runs offset optimizer repeatedly over the
              internal representation of the program  until  fur-
              ther  optimization  proves impossible or this limit
              is reached.  Default  limit  is  8,  increasing  it
              might make a bit tighter code.

       -a N, --segment-align N
              assume  segments will be aligned at the boundary of
              N bytes when the program is loaded.  lit needs this
              info  to  be  able to reduce most of expressions at
              link time, leaving only a  minimum  of  work  to  a
              loader.   Default  is 4, i.e.  segments are assumed
              to be  loaded  at  the  word  boundary.   For  best
              results,  this  parameter  should  be set not lower
              than the  biggest  alignment  requested  by  .align
              directives in the program being linked.

       -h NAME, --hook NAME
              request  that  the fragment associated with NAME be
              included in the executable being build.  All  frag-
              ments  which  this  fragment  needs  will  also  be
              included.  More than one hook may be given; if none
              are given, lit will use the default hook @@hook.

       -lAR, --library AR,
              add  libAR.a  to  the  list  of files that lit will
              search for needed fragments.

       -LDIR, --libdir DIR
              add DIR to the list of directories  to  search  for
              libraries specified with -l option.

       -T[SEG] nnn
              assume  that  the segment SEG will be loaded at the
              address nnn.   nnn  may  be  decimal  (ddd),  octal
              (0ooo),  or  hexadecimal  (0xhhh) number.  In fact,
              this option is equivalent to assignment of  nnn  to
              special  symbol segment@@start.  If SEG is omitted,
              text is assumed.

       -m[FILE], --map[=FILE]
              write primitive unsorted symbol map  to  FILE.   If
              FILE  is omitted, the map is output to stdout.  The
              map is meant for primitive debuggers, but may  also
              be  useful  when  you  want  to  find out where the
              linker has put what.

       -E, --expr-print-long
              affects verbosity of debugging dumps requested with
              --trace  or --dump.  Giving this option once causes
              elements and noname symbols referred  from  ELEMENT
              and NAME expressions to be prefixed with their mem-
              ory addresses.  Giving this option twice results in
              every  expression  being  prefixed  with its memory
              address.

       -t SPEC, --trace SPEC
              enable debugging  output  to  stdout.   SPEC  is  a
              string  of  the  form KEY[+|-KEY][+|-KEY]...  where
              +KEY turns on certain tracing facility, -KEY  turns
              the facility off.  KEY may be any of the following:
              all, opt, opt2, reduce, files, read, needs,  point,
              misc, expr.  all turns on all trace facilities; for
              the description of other facilities  refer  to  the
              ast source.

       -d SPEC, --dump SPEC
              enable  debugging  dumps of internal representation
              of the program being assembled at  certain  points.
              SPEC  is  parsed  in  the same way as for --trace ;
              valid  dump  keys  are  all,  parse,  opt,  reduce,
              freeze, unroll, merge.

LINKER OPERATION OVERVIEW
       lit  makes two passes through the files being linked.  The
       purpose of the first pass is to determine which  fragments
       from  which  files are to be linked in.  The linker starts
       with some symbols (typically the only one - @@hook) marked
       as  needed,  and  reads  the  NAMETABLE and NEEDS areas of
       every file, building a dependency graph for names found in
       the  files  based  on the need list of every name.  In the
       end of the first pass, the linker  has  a  nametable  full
       with  names, some subset of which is marked as needed.  If
       there are needed names for which the linker has not seen a
       definition,  the  linker  flags these symbols as undefined
       and terminates; otherwise, all is well and the linker goes
       on to the second pass.

       The  second pass visits each file which claimes to contain
       a definition for at least one  needed  name  SEGMENTS  and
       DEFINITIONS  areas  from  them.   From the SEGMENTS areas,
       needed fragments are picked  up;  unneeded  fragments  are
       skipped.   From  the  DEFINITIONS area, the definitions of
       needed names are read.  Also are read the  definitions  of
       (not  necessarily  needed)  special  names,  such  as seg-
       ment@@blocksize.  Other definitions are  skipped  to  save
       memory.

       At  the  end  of the second pass, the linker has the whole
       program read in, represented in an internal  form.   Frag-
       ments  in  every  segment  are placed back-to-back to each
       other, all fragment names become defined, the only  possi-
       bly  undefined  names  at this point are the special names
       segment@@start.

       The offset optimizer (see ast(1)) is run over the internal
       representation  of  the  program  to minimize the commands
       whose arguments depend on relative positions of fragments,
       and so were nonoptimizable in assembly time.

       The  optimization normally results in most fragments' size
       intervals being narrowed down to constants.  If  any  ele-
       ments  are  still  of variable size after the end of opti-
       mization, their size if fixed at the  higher  boundary  of
       the  size  interval.   If  the actual size of such element
       turns out smaller than the size it is fixed  at,  it  will
       have to be padded to that size when the code for that ele-
       ment is generated.

       The linker then performs some simplifying  transformations
       over  the  element chains: DATA and CMD elements with con-
       stant  arguments  are  transformed  into  BLOCK   elements
       (unrolling), and adjacent BLOCK elements are merged.

       Then  the resulting program is written to the output file,
       the linking process is finished.

HANDLING LIBRARIES
       lit is capable of traversing archives in the basic  (with-
       out support for long character names and names with embed-
       ded spaces) "!<arch>\n" format.  If ar on your system uses
       a  different  format, get the GNU ar.  Currently, there is
       no ranlib in TTOOLS, and lit cannot use archive index yet;
       this is likely to change in a future release.

SPECIAL NAMES
       Some  names have special meaning to the linker.  This sec-
       tion enumerates these names and explains their  effect  on
       linker operation.

       segment@@start
              represents  the  start  address  of  the segment in
              transputer's memory.  It may be assigned a value in
              one  of  the  files  being linked, or it may be set
              using the -Tsegment address switch.  If it  is  not
              set  in  one way or the other, it remains undefined
              until loading.  The more info about segment  place-
              ment you give to the linker, the better results you
              can expect from offset optimization.  For  example,
              to  allow  offset  optimizer  to  minimize commands
              whose arguments depend  on  relative  placement  of
              segments, you can tell the linker that the segments
              are going to be loaded back-to-back:

                   .globl text@@size
                   .globl data@@size
                   .globl bss@@size

                   data@@start = text@@start + text@@size
                   bss@@start  = data@@start + data@@size


       segment@@size
              represents the size of  segment  in  bytes.   These
              symbols  are  defined  by  the  linker,  and may be
              referred to in  programs.   Note  that  the  linker
              always  pads  the segment with zeroes to a multiple
              of segment-align, so the  above  back-to-back  seg-
              ments  example is safe in the sense of alignment of
              data and bss segments.

       segment@@blocksize
              may be defined in the program to  tell  the  linker
              not  hesitate  to  unroll DATA elements in the seg-
              ment, if the  BLOCK  elements  resulting  from  the
              unrolling  are  not bigger than segment@@blocksize.
              By default, DATA elements with constant  value  and
              count  are  unrolled only if the resulting BLOCK is
              smaller than 32 bytes, so as  to  keep  the  output
              file compact.

       @@hook is the default name from which the linker starts to
              build the fragment dependency graph, which is  used
              for selection of fragments to link in.  Typically a
              startup file contains a fragment  with  this  name.
              You  can  specify  an  alternative  starting symbol
              using --hook option.

BUGS
       If you find any, please submit a description  of  the  bug
       and the data the bug exposes on to bug-ttools@botik.ru.

SEE ALSO
       ast(1), dast(1), lit(5), litdump(1), ttools(1)

AUTHOR
       lit is written by Yury Shevchuk (sizif@botik.ru)