changeset 113:f4a489ebd44a

Added some basic documentation of the linker
author lost
date Sat, 17 Jan 2009 20:54:20 +0000
parents a567dbb3f1d4
children c65fcec346cd
files lwlink/trunk/doc/lwlink.txt lwlink/trunk/doc/scripts.txt
diffstat 2 files changed, 97 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lwlink/trunk/doc/lwlink.txt	Sat Jan 17 16:55:53 2009 +0000
+++ b/lwlink/trunk/doc/lwlink.txt	Sat Jan 17 20:54:20 2009 +0000
@@ -0,0 +1,51 @@
+This is the companion linker to LWASM. It reads object files generated by
+LWASM and combines them into an actual binary.
+
+During linking, each file is read into memory. A list of externally
+referenced symbols is made along with where these symbols are referenced.
+Each external reference is checked against all previously loaded files (in
+order of loading) and if a match is found, a note of that fact is made and a
+link between the previously loaded file and the current reference.
+
+Once all files are loaded, the symbol table is checked for any symbols which
+are still unresolved. If any are found, the linking process complains and
+bails out.
+
+Once all the object files have been read, the linker follows a
+pre-determined script for the specified target or a script supplied by the
+user to lay out the binary. The instructions from the script are followed
+blindly as it is assumed the user knows what he is doing.
+
+For each defined section, the linker begins constructing the section data by
+resolving each instance of that section in the order it was encountered. All
+symbols defined by that section (local or exported) are assigned addresses.
+The exact offset into the final section data is recorded for any incomplete
+references in that section. All section base address references are resolved
+to actual addresses at this stage.
+
+Once all sections have been laid out and addresses assigned to all symbols,
+all incomplete references are resolved and the resulting value placed into
+the appropriate data stream. If any references cannot be resolved at this
+stage, the linker will complain and bail out.
+
+Once all sections, symbols, and incomplete references have been resolved,
+the binary will output as appropriate for the specified target.
+
+See the file "scripts.txt" for information about linker scripts and the
+restrictions based on the output target.
+
+The following output targets are supported:
+
+Raw: this is a raw binary with no header information, etc. Suitable for ROM
+images, etc. By default, the raw target starts the binary at address 0, puts
+any section named "init" first, then "code" and/or "text", then all other
+non-bss sections, then all bss sections. Note that any "bss" type section
+that exists anywhere but at the end of the binary (i.e. is between or before
+one or more non-bss sections) will be included as a series of NUL bytes.
+
+DECB: this creates a LOADM style binary according to the linker script. By
+default, this target places the sections in the same order as the raw target
+but implements a load address of $2000. bss sections will not be included in
+the actual output. If a bss section appears between two non-bss sections, a
+new output block will be created in the output file.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lwlink/trunk/doc/scripts.txt	Sat Jan 17 20:54:20 2009 +0000
@@ -0,0 +1,46 @@
+LWLINK linker scripts
+
+A linker script is used to instruct the linker about how to assemble the
+various sections into a completed binary. It consists of a series of
+directives which are considered in the order they are encountered. Any
+section not referenced by a directive is assumed to be loaded after the
+final section explicitly referenced.
+
+A section may only be referenced once. Any subsequent references will have
+no effect.
+
+section <name> load at <addr>
+
+This causes the section <name> to load at <addr>. For raw target, only one
+"load at" entry is allowed for non-bss sections and it must be the first
+one. For raw targets, it affects the addresses the linker assigns to symbols
+but has no other affect on the output. bss sections may all have separate
+load addresses but since they will not appear in the binary anyway, this is
+okay.
+
+For the DECB target, each "load at" entry will cause a new "block" to be
+output to the binary which will contain the load address. It is legal for
+sections to overlap in this manner - the linker assumes the loader will sort
+everything out.
+
+section <name> load after <name2>
+
+This will cause the section <name> to load after <name2>. This has the
+effect of essentially gluing <name> onto the end of <name2>. If multiple
+sections are specified to load after a particular section, they will load in
+the order specified.
+
+pad to <size>
+
+This will cause the output file to be padded with NUL bytes to be exactly
+<size> bytes in length. This only makes sense for a raw target.
+
+
+If <name> is "*", then any section not already matched by the script will be
+matched. For format *,<flags> can be used to select sections which have
+particular flags set (or not set). For instance:
+
+*,!bss		This would match all sections that do not have the bss flag set
+*,bss		this would match all sections that do have the bss flag set
+
+