-m name Create a map file
-o name Name the default output file
-t sys Set the target system
+ -u sym Force an import of symbol `sym'
-v Verbose mode
-vm Verbose map file
--define sym=val Define a symbol
--dump-config name Dump a builtin configuration
--end-group End a library group
+ --force-import sym Force an import of symbol `sym'
--help Help (this text)
--lib file Link this library
--lib-path path Specify a library search path
<itemize>
<item>none
+ <item>module
<item>apple2
<item>apple2enh
<item>atari
<item>c16 (works also for the c116 with memory up to 32K)
<item>c64
<item>c128
- <item>plus4
<item>cbm510 (CBM-II series with 40 column video)
<item>cbm610 (all CBM series-II computers with 80 column video)
- <item>pet (all CBM PET systems except the 2001)
- <item>geos
+ <item>geos-apple
+ <item>geos-cbm
<item>lunix
- <item>atmos
+ <item>lynx
<item>nes
+ <item>pet (all CBM PET systems except the 2001)
+ <item>plus4
+ <item>supervision
+ <item>vic20
</itemize>
There are a few more targets defined but neither of them is actually
supported.
+ <tag><tt>-u sym[:addrsize], --force-import sym[:addrsize]</tt></tag>
+
+ Force an import of a symbol. While object files are always linked to the
+ output file, regardless if there are any references, object modules from
+ libraries get only linked in if an import can be satisfied by this module.
+ The <tt/--fore-import/ option may be used to add a reference to a symbol and
+ as a result force linkage of the module that exports the identifier.
+
+ The name of the symbol may optionally be followed by a colon and an address
+ size specifier. If no address size is specified, the default address size
+ for the target machine is used.
+
+ Please note that the symbol name needs to have the internal representation,
+ meaning you have to prepend an underline for C identifiers.
+
+
<label id="option-v">
<tag><tt>-v, --verbose</tt></tag>
written to this file. Using the <tt/-g/ option for the compiler and assembler
will increase the amount of information available. Please note that debug
information generation is currently being developed, so the format of the
- file and it's contents are subject to change without further notice.
+ file and its contents are subject to change without further notice.
<tag><tt>--lib file</tt></tag>
<item>A compiled in library path which is often <tt>/usr/lib/cc65/lib</tt> on
Linux systems.
<item>The value of the environment variable <tt/LD65_LIB/ if it is defined.
-<item>The value of the environment variable <tt/CC65_LIB/ if it is defined.
- Please note that use of this environment variable is obsolete and may
- get removed in future versions.
+<item>A subdirectory named <tt/lib/ of the directory defined in the environment
+ variable <tt/CC65_HOME/, if it is defined.
<item>Any directory added with the <tt><ref id="option--lib-path"
name="--lib-path"></tt> option on the command line.
</enum>
<enum>
<item>The current directory.
-<item>A compiled in directory which is often <tt>/usr/lib/cc65/lib</tt> on
+<item>A compiled in directory which is often <tt>/usr/lib/cc65/obj</tt> on
Linux systems.
<item>The value of the environment variable <tt/LD65_OBJ/ if it is defined.
-<item>The value of the environment variable <tt/CC65_LIB/ if it is defined.
- Please note that use of this environment variable is obsolete and may
- get removed in future versions.
+<item>A subdirectory named <tt/obj/ of the directory defined in the environment
+ variable <tt/CC65_HOME/, if it is defined.
<item>Any directory added with the <tt><ref id="option--obj-path"
name="--obj-path"></tt> option on the command line.
</enum>
<enum>
<item>The current directory.
-<item>A compiled in directory which is often <tt>/usr/lib/cc65/lib</tt> on
+<item>A compiled in directory which is often <tt>/usr/lib/cc65/cfg</tt> on
Linux systems.
<item>The value of the environment variable <tt/LD65_CFG/ if it is defined.
+<item>A subdirectory named <tt/cfg/ of the directory defined in the environment
+ variable <tt/CC65_HOME/, if it is defined.
<item>Any directory added with the <tt><ref id="option--cfg-path"
name="--cfg-path"></tt> option on the command line.
</enum>
name="Configuration files">).
After that, the linker is ready to produce an output file. Before doing that,
-it checks it's data for consistency. That is, it checks for unresolved
+it checks its data for consistency. That is, it checks for unresolved
externals (if the output format is not relocatable) and for symbol type
mismatches (for example a zero page symbol is imported by a module as absolute
symbol).
the linker will first write the <tt/CODE/ segment, then the <tt/RODATA/
segment, then the <tt/DATA/ segment - but it will not write the <tt/BSS/
segment. Why? Enter the segment type: For each segment specified, you may also
-specify a segment attribute. There are five possible segment attributes:
+specify a segment attribute. There are four possible segment attributes:
<tscreen><verb>
ro means readonly
will create an empty output file. This may be suppressed by assigning an empty
file name to that memory area.
+The <tt/%O/ sequence is also allowed inside a string. So using
+
+<tscreen><verb>
+ MEMORY {
+ ROM1: start = $A000, size = $2000, file = "%O-1.bin";
+ ROM2: start = $E000, size = $2000, file = "%O-2.bin";
+ }
+</verb></tscreen>
+
+would write two files that start with the name of the output file specified on
+the command line, with "-1.bin" and "-2.bin" appended respectively. Because
+'%' is used as an escape char, the sequence "%%" has to be used if a single
+percent sign is required.
<sect1>LOAD and RUN addresses (ROMable code)<p>
goes into <tt/ROM2/. Read/write data will be loaded into <tt/ROM2/ but is run
in <tt/RAM2/. That means that all references to labels in the <tt/DATA/
segment are relocated to be in <tt/RAM2/, but the segment is written to
-<tt/ROM2/. All your startup code has to do is, to copy the data from it's
+<tt/ROM2/. All your startup code has to do is, to copy the data from its
location in <tt/ROM2/ to the final location in <tt/RAM2/.
So, how do you know, where the data is located? This is the second point,
}
</verb></tscreen>
-This will define three external symbols that may be used in your code:
+This will define some external symbols that may be used in your code:
<tscreen><verb>
__STACK_START__ This is set to the start of the memory
- area, $C000 in this example.
+ area, $C000 in this example.
__STACK_SIZE__ The size of the area, here $1000.
__STACK_LAST__ This is NOT the same as START+SIZE.
- Instead, it it defined as the first
- address that is not used by data. If we
- don't define any segments for this area,
- the value will be the same as START.
+ Instead, it it defined as the first
+ address that is not used by data. If we
+ don't define any segments for this area,
+ the value will be the same as START.
+ __STACK_FILEOFFS__ The binary offset in the output file. This
+ is not defined for relocatable output file
+ formats (o65).
</verb></tscreen>
A memory section may also have a type. Valid types are
value given on the command line with the <tt><ref id="option-S" name="-S"></tt>
option).
+To support systems with banked memory, a special attribute named <tt/bank/ is
+available. The attribute value is an arbitrary 32 bit integer. The assembler
+has a builtin function named <tt/.BANK/ which may be used with an argument
+that has a segment reference (for example a symbol). The result of this
+function is the value of the bank attribute for the run memory area of the
+segment.
+
<sect1>Other SEGMENT attributes<p>
</verb></tscreen>
If an alignment is requested, the linker will add enough space to the output
-file, so that the new segment starts at an address that is divideable by the
+file, so that the new segment starts at an address that is dividable by the
given number without a remainder. All addresses are adjusted accordingly. To
fill the unused space, bytes of zero are used, or, if the memory area has a
"<tt/fillval/" attribute, that value. Alignment is always needed, if you have
of the segment in the run memory area, because this is what is usually
desired. If load and run memory areas are equal (which is the case if only the
load memory area has been specified), the attributes will also work. There is
-also a "<tt/align_load/" attribute that may be used to align the start of the
+also an "<tt/align_load/" attribute that may be used to align the start of the
segment in the load memory area, in case different load and run areas have
been specified. There are no special attributes to set start or offset for
just the load memory area.
</verb></tscreen>
The only other available output format is the o65 format specified by Andre
-Fachat. It is defined like this:
+Fachat (see the <htmlurl url="http://www.6502.org/users/andre/o65/fileformat.html"
+name="6502 binary relocation format specification">). It is defined like this:
<tscreen><verb>
FILES {
The <tt/FORMAT/ section is used to describe file formats. The default (binary)
format has currently no attributes, so, while it may be listed in this
-section, the attribute list is empty. The second supported format, o65, has
-several attributes that may be defined here.
+section, the attribute list is empty. The second supported format,
+<htmlurl url="http://www.6502.org/users/andre/o65/fileformat.html" name="o65">,
+has several attributes that may be defined here.
<tscreen><verb>
FORMATS {
<sect1>The SYMBOLS section<label id="SYMBOLS"><p>
The configuration file may also be used to define symbols used in the link
-stage. The mandatory attribute for a symbol is its value. A second, boolean
-attribute named <tt/weak/ is available. If a symbol is marked as weak, it may
-be overridden by defining a symbol of the same name from the command line. The
-default for symbols is that they're strong, which means that an attempt to
-define a symbol with the same name from the command line will lead to an
-error.
+stage or to force symbols imports. This is done in the SYMBOLS section. The
+symbol name is followed by a colon and symbol attributes.
+
+The following symbol attributes are supported:
+
+<descrip>
+
+ <tag><tt>addrsize</tt></tag>
+
+ The <tt/addrsize/ attribute specifies the address size of the symbol and
+ may be one of
+<itemize>
+ <item><tt/zp/, <tt/zeropage/ or <tt/direct/
+ <item><tt/abs/, <tt/absolute/ or <tt/near/
+ <item><tt/far/
+ <item><tt/long/ or <tt/dword/.
+</itemize>
+
+Without this attribute, the default address size is <tt/abs/.
+
+ <tag><tt>type</tt></tag>
+
+ This attribute is mandatory. Its value is one of <tt/export/, <tt/import/ or
+ <tt/weak/. <tt/export/ means that the symbol is defined and exported from
+ the linker config. <tt/import/ means that an import is generated for this
+ symbol, eventually forcing a module that exports this symbol to be included
+ in the output. <tt/weak/ is similar as <tt/export/. However, the symbol is
+ only defined if it is not defined elsewhere.
+
+ <tag><tt>value</tt></tag>
+
+ This must only be given for symbols of type <tt/export/ or <tt/weak/. It
+ defines the value of the symbol and may be an expression.
+
+</descrip>
The following example defines the stack size for an application, but allows
the programmer to override the value by specifying <tt/--define
<tscreen><verb>
SYMBOLS {
# Define the stack size for the application
- __STACKSIZE__: value = $800, weak = yes;
+ __STACKSIZE__: type = weak, value = $800;
}
</verb></tscreen>
<sect1>Builtin configurations<p>
-The builtin configurations are part of the linker source. They are also
-distributed together with the machine specific binary packages (usually in the
-doc directory) and don't have a special format. So if you need a special
-configuration, it's a good idea to start with the builtin configuration for
-your system. In a first step, just replace <tt/-t target/ by <tt/-C
+The builtin configurations are part of the linker source. They can be retrieved
+with <tt/--dump-config/ and don't have a special format. So if you need a
+special configuration, it's a good idea to start with the builtin configuration
+for your system. In a first step, just replace <tt/-t target/ by <tt/-C
configfile/. Then go on and modify the config file to suit your needs.
+<sect1>Secondary configurations<p>
+
+Several machine specific binary packages are distributed together with secondary
+configurations (in the cfg directory). These configurations can be used with
+<tt/-C configfile/ too.
+
+
+
<sect>Special segments<p>
The builtin config files do contain segments that have a special meaning for
and the libraries. It is placed in its own segment because it needs to be
loaded at the lowest possible program address on several platforms.
-<sect1>HEAP<p>
+<sect1>ZPSAVE<p>
-This segment defines the location of the memory heap used by the malloc
-routine.
+The ZPSAVE segment contains the original values of the zeropage locations used
+by the ZEROPAGE segment. It is placed in its own segment because it must not be
+initialized.