---
name: "ld86"
section: "1"
platform: "linux"
package: "bin86"
version: "0.16.21-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/ld86"
---

# ld86(1)

Linker for as86(1)

## NAME

ld86 - Linker for [as86(1)](/as86/1.md)

## SYNOPSIS

**ld86** \[**-03MNdimrstyz**\[-\]\] \[**-l*lib\_extension***\] \[**-o *outfile***\] \[**-C*crtfile***\] \[**-L*libdir***\] \[**-O*libfile***\] \[**-T*textaddr***\] \[**-H*heapsize***\] \[**-D*dataaddr***\] **infile ...**

## DESCRIPTION

This linker understands only the object files produced by the as86 assembler, it can link them into either an impure or a separate I&D executable.

The linking defaults are everything off or none except for **-0** and the output file is **a.out**. There is *not* a standard library location defined in the linker.

## OPTIONS

- **-0**

  produce header with 16-bit magic

- **-3**

  produce header with 32-bit magic

- **-7**

  produce Seventh Edition UNIX a.out header.

- **-d**

  delete the header from the output file, used for MSDOS COM files. As a side effect this also includes -s as there's nowhere to put a symbol table.

- **-C***x*

  add file libdir-from-search/crtx.o to list of files linked

- **-D**

  data base address follows (in format suitable for strtoul)

- **-H**

  the top of heap (initial stack) address (in format suitable for strtoul)

- **-L***x*

  add dir name *x* to the head of the list of library dirs searched

- **-M**

  print symbols linked on stdout

- **-N**

  Create a native Linux OMAGIC output file. If the contents are i386 code the binary can be either linked by GCC or executed by linux. If the **-z** option is also included the linker can generate a QMAGIC executable.

- **-O***x*

  add library or object file libdir-from-search/x to list of files linked

- **-T**

  text base address follows (in format suitable for strtoul)

- **-i**

  separate I&D output

- **-l***x*

  add library libdir-from-search/libx.a to list of files linked

- **-m**

  print modules linked on stdout

- **-o**

  output file name follows

- **-s**

  strip symbols

- **-r**

  Generate a relocatable object from one source object, if the linker is given the -N option also the output format will be the hosts native format if possible.

- **-t**

  trace modules being looked at on stdout

- **-y**

  Alter the symbol tables to add label 'extensions' so that labels with more than 8 characters can be stored in elks executables.

- **-z**

  produce "unmapped zero page" or "QMAGIC" executables

All the options not taking an argument may be turned off by following the option letter by a '-', as for cc1.

## PREDEFINED LABELS

The linker predefines several labels that can be imported into user programs.

- **\_\_etext**

  Standard C variable for the end of the text segment.

- **\_\_edata**

  Standard C variable for the end of the initialized data.

- **\_\_end**

  Standard C variable for the end of the bss area.

- **\_\_segoff**

  The offset within the executable file between the start of the text segment and the start of the data segment in 16 byte 'paragraphs'. Note this is **zero** for impure (tiny model) executables and is adjusted for executables that don't start at offset 0 within the segment.

- **\_\_segXDL**

  The lowest address with data in segment 'X'. (e.g. \_\_seg0DL is for segment zero or the text segment, \_\_seg3DL is for the data segment) The value 'X' is a hex digit.

- **\_\_segXDH**

  The top of segment 'X's data area.

- **\_\_segXCL**

  The bottom of segment 'X's 'common data' or uninitialized data area. Each segment has both an initialized and uninitialized data area.

- **\_\_segXCH**

  The top of segment 'X's common area.

- **\_\_segXSO**

  This is the adjusted offset from segment 0 of the start of segment 'X' in 'paragraphs'.

## HISTORY

The 6809 version does not support -i.

The previous versions of the linker could produce an 8086 executable with segments of a size \> 64 KiB, now only i386 executables may have segments this large.

## BUGS

The linker cannot deal with reverse seeks caused by **org** instructions in the object file. Unlike previous versions the current one traps the error rather than trying to fill up the hard disk.

The linker produces a broken a.out object file if given one input and the **-r** option this is so it is compatible with pre-dev86 versions.

## AUTHOR

**ld86** was written by Bruce Evans.
