Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ ld(CP) — OpenDesktop Software Development System 1.0.0d

Media Vault

Software Library

Restoration Projects

Artifacts Sought

     Name
          ld - invokes the link editor

     Syntax
          ld [options] filename

     Description
          The ld command combines several object files into one,
          performs relocation, resolves external symbols, and supports
          symbol table information for symbolic debugging.  It creates
          an executable program by combining one or more object files
          and copying the executable result to the file a.out.  The
          filename must name an object or library file. By convention
          these names have the ``.o'' (for object) or ``.a'' (for
          archive library) extensions. If more than one name is given,
          the names must be separated by one or more spaces.  If any
          input file, filename, is not an object file, ld assumes it
          is either an archive library or a text file containing link
          editor directives.  By default, the file a.out is excutable
          if no errors occurred during the load.  If errors occur
          while linking, ld displays an error message; the resulting
          a.out file is unexecutable.

          ld concatenates the contents of the given object files in
          the order given in the command line.  Library files in the
          command line are examined only if there are unresolved
          external references encountered from previous object files.

          The library is searched iteratively to satisfy as many
          references as possible and only those routines that define
          unresolved external references are concatenated.  The
          library (archive) symbol table (see ar(F)) is searched
          sequentially with as many passes as are necessary to resolve
          external references which can be satisfied by library
          members.  Thus, the ordering of library members is
          functionally unimportant, unless there exist multiple
          library members defining the same external symbol.  The
          library may be either a relocatable archive library or a
          shared library.  Object and library files are processed at
          the point they are encountered in the argument list, so the
          order of files in the command line is important.  In
          general, all object files should be given before library
          files.  ld sets the entry point of the resulting program to
          the beginning of the first routine.

          ld should be invoked using the cc(CP) command instead of
          invoking it directly.  cc invokes ld as the last step of
          compilation, providing all the necessary C-language support
          routines.  Invoking ld directly is not recommended since
          failure to give command line arguments in the correct order
          can result in errors.

     Generating COFF vs. x.out Binaries
          When ld is called, it scans all the object files that are to
          be linked. If they are all COFF objects, then the resulting
          binary will be in COFF format. If any of the object files to
          be linked are in x.out format, any COFF modules in the group
          will be converted to x.out and the resulting binary will be
          in x.out format.

     Common Options
          The following options are recognized by ld, and are common
          to producing both COFF and x.out binaries.  Refer to the
          sections ``Linking COFF Binaries'' and ``Linking x.out
          Binaries'' for options specific to producing these binaries.

          -o name
               Sets the executable program filename to name instead of
               a.out.

          -r   XENIX VERSION: Invokes the incremental linker,
               /lib/ldr, with the arguments passed to ld to produce a
               relocatable output file.

          AT&T VERSION: Retains relocation entries in the output
          object file.  Relocation entries must be saved if the output
          file is to become an input file in a subsequent ld run.  The
          link editor will not complain about unresolved references,
          and the output file will not be executable.

          -s   Strips line number entries and symbol table information
               from the output object file.

          -u symbol
               Designates the specified symbol as undefined.  This is
               useful for loading entirely from a library, since
               initially the symbol table is empty and an unresolved
               reference is needed to force the loading of the first
               routine.  The placement of this option on the ld line
               is significant; it must be placed before the library
               which will define the symbol.

          -V   Outputs a message giving information about the version
               of ld being used.

          -SE[GMENTS]:number
               Controls the number of segments that the linker allows
               a program to have. The default is 128, but you can set
               number to any value (decimal, octal, or hexadecimal) in
               the range 1-1024 (decimal).

          For each segment, the linker must allocate some space to
          keep track of segment information. When you set the segment
          limit higher than 128, the linker allocates more space for
          segment information. For programs with fewer than 128
          segments, you can keep the storage requirements of the
          linker at the lowest level possible by setting number to
          reflect the actual number of segments in the program. The
          linker displays an error message if the number of segments
          allocated is too high for the amount of memory the linker
          has available.

          -M[AP] [:number]
               Creates a map file. This option is equivalent to using
               the -Fm option with the cc command, except that you can
               give a number argument with the -M option. The number
               argument is any positive integer (decimal, octal, or
               hexadecimal) up to 65,535 (decimal) specifying how many
               symbols are sorted in the map listing. If no number
               argument is given, a maximum of 2048 symbols is sorted.
               (In practice, the number of sorted symbols is limited
               by the amount of free heap space.) If a number argument
               is given, the alphabetical list of symbols does not
               appear in the map file.

          -LI[NENUMBERS]
               Creates a map file and includes the line numbers and
               associated addresses of the source program. This option
               is equivalent to using the -Zd option with the cc
               command.

          -ST[BACK]:number
               Specifies the size of the stack for your program, where
               number is any positive value (decimal, octal, or
               hexadecimal) up to 65,535 (decimal) representing the
               size, in bytes, of the stack. This option is equivalent
               to using the -F option of the cc command.

     Linking COFF Binaries
          The following options are recognized by ld for linking COFF
          binaries:

          -e epsym
               Set the default entry point address for the output file
               to be that of the symbol epsym.

          -f fill
               Set the default fill pattern for ``holes'' within an
               output section as well as initialized bss sections.
               The argument fill is a two-byte constant.

          -lx  Search a library libx.a, where x is up to nine
               characters.  A library is searched when its name is
               encountered, so the placement of a -l is significant.
               By default, libraries are located in LIBDIR or LLIBDIR.

          -m   Produce a map or listing of the input/output sections
               on the standard output.

          -a   Create an absolute file.  This is the default if the -r
               option is not used.  Used with the -r option, -a
               allocates memory for common symbols.

          -t   Turn off the warning about multiply-defined symbols
               that are not the same size.

          -x   Do not preserve local symbols in the output symbol
               table; enter external and static symbols only.  This
               option saves some space in the output file.

          -z   Do not bind anything to address zero.  This option will
               allow runtime detection of null pointers.

          -L dir
               Change the algorithm of searching for libx.a to look in
               dir before looking in LIBDIR and LLIBDIR.  This option
               is effective only if it precedes the -l option on the
               command line.

          -M   Output a message for each multiply-defined external
               definition.

          -N   Put the text section at the beginning of the text
               segment rather than after all header information, and
               put the data section immediately following text in the
               core image.

          -VS num
               Use num as a decimal version stamp identifying the
               a.out file that is produced.  The version stamp is
               stored in the optional header.

          -Y[LU],dir
               Change the default directory used for finding
               libraries.  If L is specified, the first default
               directory which ld searches, LIBDIR, is replaced by
               dir.  If U is specified and ld has been built with a
               second default directory, LLIBDIR, then that directory
               is replaced by dir.  If ld was built with only one
               default directory and U is specified a warning is
               printed and the option is ignored.

     Linking x.out Binaries
          The user must make sure that the most recent library
          versions have been processed with ranlib(CP) before linking.
          Library files for x.out format binaries must be in
          ranlib(CP) format, that is, the first member must be named
          __.SYMDEF, which is a dictionary for the library.  ld
          compares the modification dates of the library and the
          __.SYMDEF entry, so if object files have been added to the
          library since __.SYMDEF was created, the link may result in
          an ``invalid object module'' that cannot run.

          The following options are recognized by ld for linking x.out
          binaries:

          -A num
               Creates a standalone program whose expected load
               address (in hexadecimal) is num.  This option sets the
               absolute flag in the header of the a.out file.  Such
               program files can only be executed as standalone
               programs.  Options -A and -F are mutually exclusive.

          -B num
               Sets the text selector bias to the specified
               hexadecimal number.

          -c num
               Alters the default target CPU in the x.out header.  num
               can be 0, 1, 2, or 3 indicating 8086, 80186, 80286 and
               80386 processors, respectively.  The default on
               8086/80286 systems is 0.  The default on 80386 systems
               is 3.  Note that this option only alters the default;
               if object modules containing code for a higher numbered
               processor are linked, then that will take precedence
               over the default.

          -C
               Causes the link editor to ignore the case of symbols.

          -D num
               Sets the data selector bias to the specified
               hexadecimal number.

          -F num
               Sets the size of the program stack to num bytes where
               num is a hexadecimal number. This option is ignored for
               80386 programs which have a variable sized stack.  By
               default 8086 programs have a variable stack located at
               the top of the first data segment, and 80286 programs
               have a fixed size 4096 byte stack.  The -F option is
               incompatible with the -A option that cannot be opened
               by more than one user at the same time.

          -g   Includes symbolic information for sdb.

          -i   Creates separate instruction and data spaces for small
               model programs.  When the output file is executed, the
               program text and data areas are allocated separate
               physical segments.  The text portion will be read-only
               and shared by all users executing the file.

          -La
               Sets advisory file locking. Advisory locking is used on
               files with access modes that do not require mandatory
               locking.

          -Lm

               Sets mandatory file locking. Mandatory file locking is
               used on files that cannot be opened by more than one
               process at a time.

          -m name
               Creates a link map file named name that includes public
               symbols.

          -Mx  Specifies the memory model. x can have the following
               values:
               s    small
               m    middle
               l    large
               h    huge
               e    mixed

          -n num
               Truncates symbols to the length specified by num.

          -N num
               Sets the pagesize to hex-num (which should be a
               multiple of 512) - the default is 1024 for 80386
               programs.  8086/80186/80286 programs do not normally
               have page-aligned x.out files and the default for these
               is 0.

          -P
               Disables packing of segments

          -R   Ensures that the relocation table is of non-zero size.
               Important for 8086 compatibility.

          -Rd  num
               Specify the data segment relocation offset (80386
               only).  num is hexadecimal.

          -Rt  num
               Specify the text segment relocation offset (80386 only)
               num is hexadecimal.

          -S num
               Sets the maximum number of segments to num.  If no
               argument is given, the default is 128.

     Files
          /bin/ld
          LIBDIR/libx.a            libraries
          LLIBDIR/libx.a           libraries
          a.out                    output file
          LIBDIR                   usually /lib
          LLIBDIR                  usually /usr/lib


     See Also
          as(CP), cc(CP), masm(CP), mkshlib(CP), ranlib(CP), exit(S),
          end(S), a.out(F), ar(F).

     Notes
          Through its options and input directives, the common link
          editor gives users great flexibility; however, those who use
          the input directives must assume some added
          responsibilities.  Input directives and options should
          insure the following properties for programs:

          -    C defines a zero pointer as null.  A pointer to which
               zero has been assigned must not point to any object.
               To satisfy this, users must not place any object at
               virtual address zero in the program's address space.

          -    When the link editor is called through cc(CP), a
               startup routine is linked with the user's program.
               This routine calls exit( ) [see exit(S)] after
               execution of the main program.  If the user calls the
               link editor directly, then the user must insure that
               the program always calls exit( ) rather than falling
               through the end of the entry routine.

          The symbols etext, edata, and end (see end(S)) are reserved
          and are defined by the link editor.  It is incorrect for a
          user program to redefine them.

          If the link editor does not recognize an input file as an
          object file or an archive file, it will assume that it
          contains link editor directives and will attempt to parse
          it.  This will occasionally produce an error message
          complaining about ``syntax errors''.

          Arithmetic expressions may only have one forward referenced
          symbol per expression.

          If you are using XENIX binaries, please refer to the manual
          entry for this utility in the XENIX Development Guide for
          information on the appropriate usage with XENIX binaries.

     Standards Conformance
          ld is conformant with:
          AT&T SVID Issue 2, Select Code 307-127;
          and The X/Open Portability Guide II of January 1987.

                                                (printed 6/18/89)



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