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 :

Dabei gilt : Für folgende Dateitypen benutzt DLINK32 automatisch diese Erweiterungen : 5.2 Konfigurationsdateien

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 :

Hier ist ein Beispiel für eine Response-Datei namens TEST.RSP : Das Linken dieses Programms wird durch folgende Anweisung ausgeführt : Die Optionen und Dateinamen in der Response-Datei haben den gleichen Stellenwert wie solche, die direkt in der Kommandozeile angegeben werden. Damit haben auch sie Vorrang vor Optionen aus der Konfigurationsdatei.

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
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.

5.4.2 LIBRARY-Anweisung

Syntax : LIBRARY Bibliotheksname
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.

5.4.3 EXETYPE-Anweisung

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
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.

5.4.7 HEAPSIZE-Anweisung

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
                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.

5.4.12 IMPORTS-Anweisung

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 :

Die 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.
In den Importbibliotheken sind alle Funktionen immer zusammen mit deren Ordinalnummern hinterlegt, so daß hier immer direkt über die Ordinalnummer importiert werden kann.