# HG changeset patch
# User lost@l-w.ca
# Date 1314426095 21600
# Node ID a26b045c4e18123aa7d2665d62233b015f2d4d81
# Parent 3b58d76ea0324f7c61b93af47b45d27ded9d295b
Added documentation about OS9 module support in lwlink
diff -r 3b58d76ea032 -r a26b045c4e18 docs/manual.docbook.sgml
--- a/docs/manual.docbook.sgml Fri Aug 26 23:44:44 2011 -0600
+++ b/docs/manual.docbook.sgml Sat Aug 27 00:21:35 2011 -0600
@@ -137,8 +137,7 @@
-LWLINK does not, yet, have the ability to create OS9 modules from object
-files.
+As of version 4.5, LWLINK also supports creation of OS9 modules.
@@ -1976,6 +1975,87 @@
+
+Format Specific Linking Notes
+
+Some formats require special information to be able to generate actual
+binaries. If the specific format you are interested in is not listed in
+this section, then there is nothing special you need to know about to create
+a final binary.
+
+
+OS9 Modules
+
+OS9 modules need to embed several items into the module header. These
+items are the type of module, the langauge of the module, the module
+attributes, the module revision number, the data size (bss), and the
+execution offset. These are all either calculated or default to reasonable
+values.
+
+The data size is calcuated as the sum of all sections named "bss" or
+".bss" in all object files that are linked together.
+
+The execution offset is calculated from the address of the special
+symbol "__start" which must be an exported (external) symbol in one of the
+objects to be linked.
+
+The type defaults to "Prgrm" or "Program module". The language
+defaults to "Objct" or "6809 object code". Attributes default to enabling
+the re-entrant flag. And finally, the revision defaults to zero.
+
+The embedded module name is the output filename. If the output
+filename includes more than just the filename, this will probably not be
+what you want.
+
+The type, language, attributes, revision, and module name can all be
+overridden by providing a special section in exactly one of the object files
+to be linked. This section is called "__os9" (note the two underscores).
+To override the type, language, attributes, or revision values, define a
+non-exported symbol in this section called "type", "lang", "attr", or "rev"
+respectively. Any other symbols defined are ignored. To override the
+module name, include as the only actual code in the section a NUL terminated
+string (the FCN directive is useful for this). If there is no code in the
+section or it beings with a NUL, the default name will be used. Any of the
+preceeding that are not defined in the special section will retain their
+default values.
+
+The built-in link script for OS9 modules will place the following
+sections, in order, in the module: "code", ".text", "data", ".data". It
+will merge all sections with the name "bss" or ".bss" into the "data"
+section. All other section names are ignored. What this means is that you
+must define your data variables in the a section called "bss" or ".bss" even
+though you will be refencing them all as offsets from U. This does have the
+unpleasant side effect that all BSS references will end up being 16 bit
+offsets because the assembler cannot know what the offset will be once the
+linker is finished its work. Thus, if the tightest possible code is
+required, having LWASM directly output the module is a better choice.
+
+While the built-in link script is probably sufficient for most
+purposes, you can provide your own script. If you provide a custom link
+script, you must start your code and data sections at location 000D to
+accommodate the module header. Otherwise, you will have an incorrect
+location for the execution offset. You must use the ENTRY directive in the
+script to define the entry point for the module.
+
+It should also be obvious from the above that you cannot mix the bss
+(rmb) definitions with the module code when linking separately. Those
+familiar with typical module creation will probably find this an unpleasant
+difference but it is unavoidable.
+
+It should also be noted that direct page references should also be
+avoided because you cannot know ahead of time whether the linker is going to
+end up putting a particular variable in the first 256 bytes of the module's
+data space. If, however, you know for certain you will have less than 256
+bytes of defined data space across all of the object files that will be
+linked, you can instead use forced DP addressing for your data addresses
+instead of the ,u notation. When linking with 3rd party libraries, this
+practice should be avoided. Also, when creating libraries, always use the
+offset from U technique.
+
+
+
+
+