5. DLINK32 - Der Linker
Der Linker DLINK32 dient zum Erstellen von Programmdateien aus Objekt- und Bibliotheksmodulen. Hierzu benutzt DLINK32 Kommandozeilenparameter und/oder eine Response-Datei, die die entsprechenden Parameter und Dateinamen enthält. DLINK32 kann drei verschieden Ausgabeformate erzeugen :
5.1 Optionen
Der Aufruf von DLINK32 geschieht auf folgende Weise :
Häufig benutzte Optionen können in einer Konfigurationsdatei namens DLINK32.CFG zusammengefaßt werden. DLINK32 sucht automatisch nach einer solchen Datei im aktuellen Verzeichnis und danach im Verzeichnis, in dem sich die ausführbare Datei DLINK32.EXE befindet (z.B. im Verzeichnis C:\DICERTE\BIN). Die Datei DLINK32.CFG ist eine reine ASCII-Textdatei, wobei die Optionen in einer Zeile mit Leerzeichen getrennt werden oder diese auf mehrere Zeilen verteilt werden können. In dieser Datei dürfen allerdings nur Optionen, keine Dateinamen angegeben werden. Im Unterverzeichnis 'BIN' wird bei der Installation automatisch eine solche Konfigurationsdatei angelegt.
Werden Optionen in einer Konfigurationsdatei und in der Kommandozeile
angegeben, haben die Optionen aus der Kommandozeile grundsätzlich
Vorrang und heben gegebenenfalls Optionen aus der Konfigurationsdatei wieder
auf.
5.3 Benutzung von Response-Dateien
Eine Response-Datei ist eine Textdatei, die die Optionen und Dateinamen für DLINK32 enthält, die normalerweise in der Kommandozeile angegeben werden. Dadurch ist es möglich, die betriebssystemspezifische Längenbegrenzung der Kommandozeile zu umgehen und weitere Optionen bzw. Dateinamen über eine Textdatei an den Linker zu übergeben. Bei der Benutzung von Response-Dateien müssen folgende Regeln beachtet werden :
-s -Sc:4000 -T:e cx.obj test.obj test.exe test.map crts.lib sys4g.lib test.defDas Linken dieses Programms wird durch folgende Anweisung ausgeführt :
5.4 Aufbau von Moduldefinitionsdateien
Moduldefinitionsdateien enthalten Einstellungen sowie weitere Informationen
zur Programmdatei, z.B. den Namen der Applikation bzw. dynamischen Linkbibliothek,
die Größe des Stacks und die exportierten und importierten Funktionen.
Die wesentlichen Elemente sind im einzelnen :
5.4.1 NAME-Anweisung
Syntax : NAME Modulname
5.4.2 LIBRARY-Anweisung
Die NAME-Anweisung gibt den Namen der ausführbaren Datei an. Dieser
muß mit dem Dateinamen übereinstimmen, wobei hier keine Dateierweiterung
angegeben wird. Die ausführbare Datei TEST.EXE besitzt daher den Modulnamen
TEST. Wird diese Anweisung nicht angegeben, leitet DLINK32 den Modulnamen
eigenständig aus dem Dateinamen ab. Die NAME-Anweisung darf nur angegeben
werden, wenn auch wirklich eine Applikation erstellt werden soll (Option
'-T:e'). Die NAME- und die nachfolgend beschriebene LIBRARY-Anweisung
dürfen nicht gemeinsam in einer Definitionsdatei benutzt werden.
Syntax : LIBRARY Bibliotheksname
5.4.3 EXETYPE-Anweisung
Die LIBRARY-Anweisung gibt den Namen einer dynamischen Linkbibliothek
an. Dieser muß mit dem Dateinamen übereinstimmen, wobei hier
keine Dateierweiterung angegeben wird. Die dynamische Bibliothek TEST.DLL
besitzt daher den Bibliotheksnamen TEST. Wird diese Anweisung nicht angegeben,
leitet DLINK32 den Modulnamen eigenständig aus dem Dateinamen ab.
Die LIBRARY-Anweisung darf nur angegeben werden, wenn auch wirklich eine
DLL erstellt werden soll (Option '-T:d'). Die LIBRARY- und die zuvor beschriebene
NAME-Anweisung dürfen nicht gemeinsam in einer Definitionsdatei benutzt
werden.
Diese Anweisung wird ignoriert.
5.4.4 DESCRIPTION-Anweisung
Diese Anweisung wird ignoriert.
5.4.5 STUB-Anweisung
Diese Anweisung wird ignoriert.
5.4.6 STACKSIZE-Anweisung
Syntax : STACKSIZE Bytes
5.4.7 HEAPSIZE-Anweisung
Diese Anweisung gibt die Größe des Stacks für eine
Applikation als hexadezimalen Wert an. Diese Anweisung kann von der Option
-Sc außer Kraft gesetzt werden.
Diese Anweisung wird ignoriert.
5.4.8 CODE-Anweisung
Diese Anweisung wird ignoriert.
5.4.9 DATA-Anweisung
Diese Anweisung wird ignoriert.
5.4.10 SEGMENTS-Anweisung
Diese Anweisung wird ignoriert.
5.4.11 EXPORTS-Anweisung
Syntax : EXPORTS
5.4.12 IMPORTS-Anweisung
Exportname[=Funktionsname] [@Ordinalnummer] [RESIDENTNAME]
...
Die EXPORTS-Anweisung leitet eine Liste mit den Namen und optionalen
Ordinalnummern der zu exportierenden Funktionen ein. In jeder der folgenden
Zeilen darf immer nur eine Funktion aufgelistet werden. Der Exportname
ist der Name der Funktion, unter dem sie von außen sichtbar ist und
der in den Exportdaten der zu erzeugenden Programmdatei eingetragen wird.
Der Funktionsname ist optional und bezeichnet den Namen der Funktion,
der innerhalb der Anwendung benutzt wird (er muß nur angeben werden,
wenn die Funktion nicht unter ihrem normalen Namen von außen sichtbar
sein soll). Die Ordinalnummer ist ein dezimaler Wert zwischen 1
und 65535. Bei der Vergabe der Ordinalnummern gilt die Einschränkung,
daß entweder für alle angegebenen Funktionen eine Ordinalnummer
angegeben werden muß oder für keine. Im letzteren Fall vergibt
DLINK32 automatisch die Ordinalnummern ausgehend vom Wert 1. Der optionale
Zusatz RESIDENTNAME wird momentan ignoriert. Enthält eine Anwendung
mindestens eine exportierte Funktion, erzeugt DLINK32 automatisch eine
Importbibliothek unter dem Namen der Programmdatei, aber mit der Endung
'.LIB'. Diese kann später von anderen Applikationen genutzt werden,
um auf die hier exportierten Funktionen zuzugreifen.
Syntax : IMPORTS
[Funktionsname=] Modul . Einsprung
...
Die IMPORTS-Anweisung leitet eine Liste mit Funktionen ein, die aus DLLs importiert werden sollen. Funktionsname ist der Name, unter dem diese Anwendung auf die Funktion aus der entsprechenden DLL zugreift, Modul bezeichnet den Namen der DLL, in der die Funktion enthalten ist und Einsprung ist wahlweise die Ordinalnummer der DLL-Funktion oder der Funktionsname, der in den Exportdaten der DLL hinterlegt ist (nur falls anders als der Funktionsname davor). Wird als Einsprung eine Ordinalnummer angegeben, muß der Funktionsname davor zwingend angegeben werden. Es sind also prinzipiell folgende drei Varianten möglich :
IMPORTS DosPutStr=sys4g.500 dps=sys4g.DosPutStr crtd._printfDie Verwendung der IMPORTS-Anweisung ist eine flexible (aber auch aufwendigere) Alternative zur Angabe von Importbibliotheken in der Kommandozeile. Sollten Sie die IMPORTS-Anweisung einmal benutzen, achten Sie unbedingt darauf, bei jeder Funktion möglichst die Ordinalnummer als Einsprung zu benutzen, da der Import solcher Funktionen durch den Programmlader sehr schnell durchgeführt werden kann (jede exportierte Funktion einer DLL besitzt eine eindeutige Ordinalnummer, über die sie sofort identifiziert werden kann). Ohne Ordinalnummer muß der Programmlader die gesamten Exportdaten einer DLL per Stringvergleich nach der jeweiligen Funktion durchsuchen, da ihm zur Identifizierung nur deren Name zur Verfügung steht.