LIB (1) Free-DOS Alpha 4 release LIB (1) NAME: lib - Bibliothekar für OBJ und LIB Dateien SYNOPSIS: lib [{option}] libfile [{option}] [{command}] [ , listfile ] DESCRIPTION: lib erzeugt eine Bibliothek (LIB Datei), welche Objektmodule (OBJ Dateien) enthält. Diese Bibliotheken werden von Linkern weiterverwendet. OPTIONS: /? Anzeige des Hilfebildschirms. /A Intern expandierte Dateinamen werden auch für "+" Kommandos erlaubt. Dies ermöglicht das Aufrischen von bereits in der Bibliothek enthaltenen Modulen, anstatt die komplette Bibliothek zu aktualisieren. Die Option wird ignoriert, falls die /G Option nicht aktiviert wurde. (Siehe dort für weitere Informationen.) Alle Module, denen das Kommando "+-" (Ersetzen) zugewiesen wurde, werden aufgefrischt. Falls keine zum Modul passende OBJ Datei gefunden wird, verbleibt das Modul in der Bibliothek unverändert und es wird eine Warnung ausgegeben. /C Diese Option bestimmt, daß die Groß- und Kleinschreibung der Symbole der Bibliothek nicht ignoriert werden darf. Dies beeinflußt nur die Erzeugung des Bibliotheksindex', die Symboldefinitionen innerhalb der Module bleiben unverändert. Sobald die Bibliothek neu erzeugt wird, wird auch der Index neu erstellt. /D Module mit demselben Namen werden innerhalb der Bibliothek akzeptiert. Das erlaubt sowohl dieselbe Datei mehrfach aufzunehmen, als auch Dateien unterschiedlichen Inhalts. /G Jokerzeichen (Wildcards: * und ?) werden mit den Modulnamen aus der Bibliothek erweitert. Normalerweise werden Jokerzeichen anhand von Dateien im Verzeichnissystem expandiert. So entfernt der Aufruf: LIB libfile - m* alle Module, welche auch eine Datei "M*.OBJ" im aktuellen Verzeichnis besitzten; während: LIB libfile /g - m* alle Module aus der Bibliothek entfernt, deren Name mit dem Buchstaben "M" beginnt. -1- LIB (1) Free-DOS Alpha 4 release LIB (1) Diese Option wird ignoriert für alle Module mit dem Kommando "+", außer die Option /A ist aktiviert. /H Zeigt die Liste der verfügbaren Optionen an. /I[=[#]] Erstellt Bibliotheksinformationen in Abhängigkeit von der Seitengröße. Pro Zeile wird die Information über eine der folgenden Seitengrößen dargestellt: die aktuelle, die minimale, die maximale, die optimale und, falls die Seitengröße sich geändert hat, die originale. Siehe auch das Kapitel: "PAGE SIZE" Unter der Tabelle wird die Anzahl verwendeter Indexseiten angezeigt. Die aktuelle Seitengröße ist die aktuell in der Bibliothek verwendete Seitengröße. Die orignale Seitengröße ist die von der originalen Bibliothek (BAK Datei). Die minimale Seitengröße gibt die kleinste Seitengröße an, mit welcher die Bibliothek erzeugbar ist. Meistens ist sie mit der optimalen identisch. Die maximale Seitengröße ist die Größe des größten OBJ Moduls der Bibliothek. Jede weitere Erhöhung der Seitengröße erhöht automatisch die Pad Bytes aller Module der Bibliothek. Die optimale Seitengröße wird so kalkuliert, daß der Datenbereich der Bibliothek minimiert wird. Um die Suchzeit nicht unnötig zu verlängern, wird eine Heuristik verwendet, die die Suche auf bestimmte Seitengrößen einschränkt. Das hat zur Folge, daß eventuell die optimale verpaßt wird. Um zu erzwingen, daß alle Seitengrößen getestet werden, muß die /I=0 Option verwendet werden. Merke: Die optimale Seitengröße ist die Bibliotheksgröße einschließlich der Pad Bytes, aber nicht einschließlich des Bibliotheksindex' und des Slack Areas. Jede Zeile enthält die folgenden Werte: 1) die Seitengröße selbst, 2) die Größe des Datenbereichs der Bibliothek mit dieser Seitengröße. 3) die Anzahl unbenutzter Pad Bytes der letzten Seite (Slack Area) und 4) die Summe aller sonstigen unbenutzten Pad Bytes des Datenbereichs. Ist das Ausrichten des Bibliotheksindex' nicht abgeschalten (siehe die /X Option), werden die Größen des Slack Areas und des Datenbereiches aufsummiert und als Datenbereichsgröße an Position 2) angezeigt. Im anderen Fall wird lediglich ein '+' Zeichen zwischen beiden Positionen angezeigt. Die Gesamtgröße der Bibliothek ergibt sich aus: Der Größe des Datenbereichs -2- LIB (1) Free-DOS Alpha 4 release LIB (1) plus der Anzahl Indexseiten * 512. Das optionale Argument dieser Option spezifiziert den Suchbereich genauer. Je höher die Zahl ist, desto mehr Zeit wird für die Suche aufgewendet. Bei Null (0) oder 65535 werden definitiv alle Seiten getestet. Scheint der Suchbereich recht groß zu werden und ist keine der Optionen "/S" oder "/Q" aktiv und ist die Standardausgabe nicht umgeleitet, wird ein Zähler angezeigt. Der Standardwert von /I= kann mit der /V Option in Kenntnis gebracht werden. Ohne das Gleichheitszeichen wird der Wert 1 angenommen, wodurch lediglich die aktuelle, die minimale und die maximale Seitengrößen dargestellt werden. /M Der Name von neu hinzugefügten Modulen bleibt unverändert. OBJ Dateien enthalten ein Feld, welches den Modulnamen aufnimmt. Da der Inhalt dieses Feldes jedoch nicht standardisiert ist, wird normalerweise der Dateiname in Großbuchstaben verwendet, damit das Modul wieder denselben Namen erhält, wird aus der Bibliothek extrahiert. Merke: Ist der Inhalt dieses Feldes nicht als Dateiname verwendbar, kann das Modul möglicherweise nicht mehr über die Kommandozeile angesprochen oder extrahiert werden. Die im Modul gespeicherte Information bleibt weiterhin nutzbar. (Siehe auch die /@= Option). /P=# Setzt die aktuelle Seitengröße auf # Byte. Siehe hierzu das Kapitel "PAGE SIZE". /Q Verhindert alle Meldungen außer Warnungen und Fehler. /S Verhindert, daß ausgegeben wird, welches Modul gerade hinzugefügt, extrahiert oder entfernt wird. /V Zeigt die Versionskontrollinformation, einige Standardwerte und Grenzen und die Größe des freien DOS Speichers an. /W Unterdrückt die Warnung, daß ein Modul, welches über das "-+" Kommando aufgefrischt werden sollte, sich nicht bereits in der Bibliothek befindet. /X Der Bibliothekindex wird nicht an einer 512 Byte Grenze innerhalb der Datei ausgerichtet. Der Index besteht aus Seiten mit einer festen Länge zu 512 Byte. Außerdem kann der Index einer der am häufigsten frequentierten Bereiche der Bibliothek sein. Die Ausrichtung kann deshalb die Zugriffsgeschwindigkeit verringern. Im schlechtesten Fall werden durch die Ausrichtung 509 Byte -3- LIB (1) Free-DOS Alpha 4 release LIB (1) verschwendet. Ist diese Option aktiviert, benötigt eine leere Bibliothek, welche kein Modul enthält, (512 + 2 * Seitengröße) Byte, also 544 Byte mit einer Seitengröße von 16 Byte. Ohne Ausrichtung des Index' reduziert sich die Größe der resultierenden Bibliothek um das Slack Area, welches mit der /I Option zur Kenntnis genommen werden kann. /@:file Aktiviert den speziellen Extrahierungsmodus, wobei der Report in der Datei "file" abgelegt wird. Falls die Bibliothek Module enthält, welche einen unzugänglichen Namen haben (vgl. di /M Option), ist es möglich, daß LIB dieses Modul nicht extrahieren kann. Im speziellen Extrahierungsmodus ist nur das "*" Kommando erlaubt, außerdem werden Jokerzeichen stets intern expandiert (vgl. die /G Option). Im Unterschied zum "normalen" Extrahieren von Modulen wird die OBJ Datei jedoch nicht nach dem Namensfeld des Moduls benannt, sondern fortlaufend nummeriert. Dieser Prozeß wird als Report in der Datei festgehalten und enthält pro extrahiertem Modul zwei Zeilen: Originalname: "~~~~~~~~~~~" Neuer Name: "###.OBJ" Wobei ~~~ für den Inhalt des Namensfelds des Moduls und ### für die laufende Nummer steht. Die doppelten Anführungszeichen sollen lediglich die Namen begrenzen. Achtung: Die extrahierten Dateien überschreiben warnunglos existierende Dateien! COMMANDS: Die Kommandos beschreiben, wie die Bibliothek zu modifizieren ist. Jedes Kommando hat die Form: [{ symbol }] { modulename } modulename Diese Liste spezifiziert die betroffenen Module. Während des Entfernens und Extrahierens wird das Namensfeld der Module in der Bibliothek und während des Hinzufügens wird der Dateiname des OBJ Moduls verglichen. modulename darf Jokerzeichen, einen Pfad und/oder eine Extension enthalten. Zum Vergleich mit dem Namensfeld wird nur der Namensanteil, d.h. ohne Laufwerk, Pfad und Extension, verwendet. Symbol - Bestimmt, daß die Module zu entfernen sind. Symbol + Bestimmt, daß die neue OBJ Module oder eine bereits bestehende Bibliothek hinzuzufügen ist. LIB erkennt während des Hinzufügens (und nur hierbei!) automatisch, ob es sich um ein OBJ Modul oder eine Bibliothek handelt. Die Extension spielt hierbei keine Rolle. -4- LIB (1) Free-DOS Alpha 4 release LIB (1) Symbol * Bestimmt, daß die Module aus der Bibliothek extrahiert werden. Bestehen die Dateien bereits, werden sie ohne Warnung überschrieben. Symbol & Es wird vollständig ignoriert. Siehe das Kapitel DIFFERENCES. Die Symbole + und * dürfen nicht kombiniert werden, da es nicht sinnfällig ist, dasselbe Modul erst zu extrahiern und dann wieder hinzuzufügen. Auch würde das alte Modul ein bereits bestehendes vor dessen Hinzufügen überschreiben. Symbole dürfen in einer beliebigen Reihenfolge kombiniert werden und dürfen von Leerzeichen getrennt werden. Ist dasselbe Module mehrfach in der Liste enthalten, was recht schnell mit Jokerzeichen passieren kann, behalten alle Symbole ihre Gültigkeit, z.B.: + module1 * mod* kombinert die Symbole "+" und "*" für das Module "module1". Das verursacht einen Fehler, da beide Symbole nicht kombinierbar sind. Merke: Da das Jokerzeichen * ebenso ein gültiges Symbol ist, kann es keinen Modulnamen anführen. In diesem Fall muß der Pfad vorangestellt werden, z.B.: *** nro: unrecognized command .\*.obj LIB erlaubt es, Bibliotheken miteinander zu verschmelzen. Ob es sich um eine Bibliothek handelt, wird erst während des Hinzufügens deutlich. Merke: Sind die Symbole "-" oder "*" einer Bibliothek zugeordnet, wird die Bibliothek solange wie ein OBJ Modul behandelt bis sie tatsächlich hinzugefügt wird, was jedoch erst nach dem Extrahieren und Entfernen gemacht wird. Die Angabe: lib lib -+ library.LIB meint nicht, daß alle Module, die in "library.lib" gespeichert sind, aus "lib.lib" entfernt werden, bevor sie aus "library.lib" hinzugefügt werden. Stattdessen wird die Zeile wie folgt interpretiert: lib lib - library.obj + library.lib Wenn die /A Option nicht aktiv ist, werden modulenames mit dem Symbol '+' stets in Abhängigkeit von Dateien expandiert. PAGE SIZE: Eine Seite ist die kleinste adressierbare Einheit einer Bibliothek. The Spezifikation erlaubt maximal 65.535 Seiten, wobei jedoch bereits zwei für interne Zwecke reserviert sind. Jedes Modul beginnt auf einer neuer Seiten. Das bedeutet auch, daß maximal 65.533 Module in einer Bibliothek gespeichert werden können. Sollte eine entsprechende Fehlermeldung erscheinen, muß eine große Bibliothek in kleine aufgeteilt werden. Die kleinste Seitengröße mag variieren, während der Manuallegung sind es 16 Byte, der tatsächliche Wert kann -5- LIB (1) Free-DOS Alpha 4 release LIB (1) jedoch mit der /V Option zur Kenntnis gebracht werden. Wächst die Zahl der Module an, kann es passieren, daß die Standardseitengröße zu klein wird. In diesem Fall erhöht LIB automatisch die Seitengröße und erzeugt die Bibliothek erneut. Es ist möglich, daß die Seitengröße mehrfach angepaßt werden muß, auch wenn es nicht sehr wahrscheinlich ist. Der umgekehrte Fall wird leider nicht unterstützt, d.h. LIB verringert die Seitengröße nicht automatisch, z.B. nach dem Entfernen vieler Module. Die /I= Option schafft hier Abhilfe. Theoretisch gibt es keinen Grund, bestimmte Seitengrößen zu meiden, so ist 61 ebenso gut wie 64. LIB läuft weder bei einer spürbar schneller noch langsamer. Es sollte deshalb diejenige gewählt werden, die die Bibliotheksgröße minimiert. Eine solche can z.B. so in Erfahrung gebracht werden: LIB /i=0 library.LIB Da der Bibliotheksindex standardmäßig ausgerichtet wird, muß die optimale Seitengröße nicht unbedingt auch die Dateigröße der Bibliothek verringern. Hierfür muß noch das Ausrichten mittels der /X Option abgeschalten werden. Einge Bibliothekare scheinen nicht alle Seitengrößen zu unterstützen, in diesem Fall sollte eine Seitengröße von 16 Byte gewählt werden. Linker zeigten dieses Problem bisher nicht. LISTFILE: Die Listdatei kann optional an die Kommandozeile angehangen und muß durch ein Komma von den vorherigen Argumenten getrennt werden. Das Komma darf nicht Teil einer Optionszeichenkette sein! Ist die Extension nicht angegeben, wird ".LST" verwendet. Die Listdatei wird ohne Warnung überschrieben, falls sie bereits existiert. In die Listdatei werden alle globale Symbole geschrieben, in der Reihenfolge, wie sie in der Bibliothek auftreten, z.B.: MSG_0000 size = 513 _E_hlpScreen MSG_0001 size = 20 _E_rmHlpScreen Das bedeutet, daß die Bibliothek zwei Module enthält "MSG_0000" und "MSG_0001". Das erstere definiert das Symbol "_E_hlpScreen" und das zweite "_E_rmHlpScreen". Die Angabe "OBJ size = #" zeigt die Größe der OBJ Datei an, die dieses Modul annehmen würde. DIFFERENCES: -6- LIB (1) Free-DOS Alpha 4 release LIB (1) Es gibt die folgenden dokumentierten Unterschiede zu anderen Bibliothekaren: o Pro Symbol können mehrere Module angegeben werden. o Die Modulespezifikation kann Jokerzeichen (* und ?) enthalten. o Symbole werden nur dann erkannt, wenn sie ein Argument anführen, z.B.: "m1+m2" ist nicht identisch zu "m1" "+" "m2". o Eine Kommandodatei kann nur Kommandos enthalten, darin sind weder Option noch der Bibliotheksname noch die Listdatei erlaubt! o Die Zeilen in einer Kommandodatei müssen nicht mit dem '&' Zeichen verbunden werden, z.B. die Sequenz: "+ m1 & + m2 + m3" wird als "+ m1 + m2 + m3" interpretiert und nicht als "+ m1 + m2". o Das Zeichen '&' wird als Symbol ohne jede Bedeutung akzepiert, d.h. "-+& m1" ist legal und identisch zu "-+ m1". o Während des Hinzufügens einer Datei entscheidet LIB automatisch, ob es sich um eine Bibliothek oder um ein OBJ Modul handelt. Ist es eine Bibliothek, werden alle darin enthaltenen Module hinzugefügt. Ist es ein OBJ Modul, wird nur dieses Modul hinzugefügt. o Das Komma, welches die Listdatei von den vorherigen Teilen der Kommandozeile trennt, muß von den Optionen durch ein Leerzeichen getrennt sein, ansonsten wird das Komma als Option interpretiert und erzeugt einen Fehler. o Einige Bibliothekare können nur Bibliotheken mit bestimmten Seitengrößen verarbeiten. ERRORLEVELS: 0 Kein Fehler oder nur niedere Warnungen sind aufgetreten. 3 ^Break oder ^C gedrückt. 100 Eine Datei konnte nicht gefunden werden, die hinzugefügt werden soll. 101 Ein zu löschendes oder zu extrahierendes Modul ist nicht in der Bibliothek. 102 Die Bibliothek enthält dasselbe Symbol mehrfach. -7- LIB (1) Free-DOS Alpha 4 release LIB (1) 103 Ein Model, welches hinzugefügt werden soll, ist bereits enthalten. 125 Versionsinformation ausgegeben. 127 Hilfebildschirm ausgegeben. alle anderen Ein (schwerwiegender) Fehler. Falls mehr als eine Warnung mit einem Errorlevel von 100 bis 103 auftritt, wird nur der Errorlevel der letzten zurückgegeben. SEE ALSO: Compiler, Assembler, Linker. KNOWN BUGS: o Da die Zeichen '*' und '-' sowohl gültige Symbole als auch gültig im Modulname sind, dürfen Modulnamen nicht damit beginnen; es kann einfach der Pfad vorangesetzt werden, z.B.: "+ *.obj" ==> "+ .\\*.obj" o Die kleinste erstellbare Bibliothek hat eine Größe von 1024 Byte; 512 Byte für eine Bibliotheksindexseite und 32 Byte für zwei Bibliotheksseiten. Da jedoch der Index auf eine durch 512 teilbare Adresse ausgerichtet wird, werden noch 480 Pad Bytes eingefügt. Siehe auch die /X Option. o Überlappen sich mehrere Modulspezifikationen ist undefiniert, welches Symbol mit welchem Modul gekoppelt wird, auch ist möglich, daß einige Modulangaben miteinander verschmelzen. Die meisten solcher Überlappungen werden jedoch entsprechend gewarnt. o Kann ein Modul, welches mittels der Symbole "-+" ersetzt werden soll, nicht zum Lesen geöffnet werden (die Existenz wurde bereits geprüft), ist das Modul aus der Bibliothek entfernt und kann nicht hinzugefügt werden. In diesem Falle sollte die BAK Datei der Bibliothek helfen. o Solange eine Datei nicht zur Bibliothek hinzugefügt wird, wird sie als OBJ Modul interpretiert. Deshalb sollte beim Hinzufügen von Bibliotheken nur das Symbol "+" Verwendung finden. EXAMPLES: lib /c msg + ./* , msg.lst Fügt der Bibliothek MSG.LIB alle *.OBJ Dateien im aktuellen Verzeichnis hinzu und erstellt die Listdatei MSG.LST. Sollte MSG.LIB noch nicht existieren, wird sie erzeugt. -8- LIB (1) Free-DOS Alpha 4 release LIB (1) lib /c msg /g - ./* Löscht alle Module in der Bibliothek. lib msg /cg -+ ./* Entfernt alle Module aus der Bibliothek, welche auch eine korrespondierene OBJ Datei im aktuellen Verzeichnis besitzen. Anschließend werden alle OBJ Dateien aus dem aktuellen Verzeichnis hinzugefügt. Das bedeutet, daß die Bibliothek aktualisiert wird. lib msg /cga -+ ./* Entfernt alle Module aus der Bibliothek, welche auch eine korrespondierene OBJ Datei im aktuellen Verzeichnis besitzen. Anschließend werden die OBJ Dateien hinzugefügt. Das bedeutet, daß die Bibliothek aufgefrischt wird. Es werden keine Module hinzugefügt, die nicht bereits enthalten sind. DISCLAIMER: Diese Software untersteht der GNU GPL Version 2 oder höher. Sie besagt unter anderem, daß die Autoren für nichts haftbar gemacht werden können. Sind Sie mit der GNU GPL nicht einverstanden, dürfen Sie weder die Quelltexte noch die ausführbaren Dateien weiterverwenden! Librarian for LIB/OBJ compatible libraries and modules Copyright (C) 1995,1996 Steffen Kaiser This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. CONTRIBUTERS: e-mail: Steffen.Kaiser@FH-Rhein-Sieg.DE James W. Lynch e-mail: jwl@atlanta.cray.com Vielen Dank an den anonymen Zusammensteller der OBJLIB.ZIP Datei, welcher von sich selbst nur als "mir" spricht. -9-