Entwerfen von dynamischen Bibliotheken


Ein wichtiger Grundsatz beim Entwurf von dynamischen Bibliotheken ist, dass diese immer abwaertskompatibel sein sollten. Das bedeutet, dass ein Programm, das mit einer aelteren Version dieser dynamischen Bibliothek gelinkt wurde, auch mit der neuen Version weiterhin lauffaehig sein sollte. Dieser Grundsatz muss nur dann nicht eingehalten werden, wenn eine voellig neue Version (major version) zu einer dynamischen Bibliotheken entwickelt wird.
Jede dynamische Bibliothek hat einen speziellen Nahem, den sogenannten soname, der dyn eigentlichen Namen der Bibliothek, sowie die Versionsnummer beinhaltet. Solange dynamische Bibliotheken abwaertskompatibel sind, also ihre Schnittstellen sich nicht aendern, sollte sich nur eine der Nummern (minor number) hinter der Hauptversionsnummer aendern.
Als Beispiel kann man die C-Bibliothek von Linux nehmen, die Abwaertskompatiblitaet fuer alle Unterversionen mit der gleichen Hauptversionsnummer garantiert. Da z. B. alle C-Bibliotheken mit der Hauptnummer 6 abwaerskompatibel sind, benutzen sie alle den gleichen soname (libc.so.6), der lediglich ein symbolischer Link auf die eigentliche, aktuelle dynamische Bibliothek ist:
1 $ ls -l /lib/libc.so.6
2 lrwxrwxrwx  1 root root 13 2004-09-03 17:36 /lib/libc.so.6 -> libc-2.3.2.so
Das Programm ldconfig sucht alle dynamischen Bibliotheken, die in bestimmten Directories liegen und erzeugt dann bei Bedarf einen symbolischen Link auf die jeweilige Version. ldconfigu untersucht standardmaessig immer die beiden Directories /lib und /usr/lib. Daneben untersucht es noch die Dateien der Directories, die auf der Kommandozeile beim Aufruf des Kommandos angegeben werden und die Directories, deren Namen sich in der Datei /etc/ld.so.conf befinden. Linkt man nun ein C-Programm, so wird der Linker immer nach einer Datei mit dem Namen /usr/lib/libc.so suchen, die ein symbolischer Link auf die gerade aktuelle dynamische C-Bibliothek ist.
Um sich alle durch ldconfig eingerichteten symbolischen links anzeigen zu lassen, muss man nur ldconfig -p aufrufen. Benutzer, die eigene dynamische Bibliothekeb entwerfen wollen, sollten wissen, was zu beachten ist, damit eine neue dynamische Bibliothek abwaertskompatibel bleibt. Es gibt drei Arten von Aenderungen an einer dynamischen Bibliothek, die diese inkompatibel zu vorherigen Versionen werden laesst:
  1. Das Aendern oder Entfernen von Funktionsschnittstellen, was ueblicherweise die von aussen aufrufbaren Funktionen sind.
  2. Das Aendern eines Funktionscodes in der Form, dass diese Funktion sich nicht mehr so verhaelt, wie es in der urspruenglichen Spezifikation festgelegt ist.
  3. Das Aendern von Datenstrukturen, die nach aussen sichtbar sind. Hierzu zaehlt jedoch nicht das Anfuegen zusaetzlicher Komponenten am Ende von Strukturen, die innerhalb der Bibliothek allokiert werden.
Dagegen ziehen die folgenden Modifikationen an einer dynamischen Bibliothek keine Inkompatiblitaet nach sich:
  1. Hinzufuegen neuer Funktionen mit anderen Namen, um die Funtionalitaet einer existierenden dynamischen Bibliothek zu erweitern.
  2. Hinzufuegen weiterer Komponenten am Ende von Strukturen, die innerhalb der Bibliothek allokiert werden. Die gilt jedoch nicht fuer Datenstrukturen, die nicht innerhalb der Bibliothek allokiert werden, da dann Programme, die mit frueheren Versionen gelinkt wurden, nicht genuegend Speicherplatz allokiert haben. Ebenso sollten keine Datenstrukturen erweitert werden, die in Arrays verwendet werden.


Zurueck || Index || Vor