Library

Aus Linupedia.org
Version vom 20. Februar 2007, 16:53 Uhr von Yehudi (Diskussion | Beiträge) (YAST heißt YaST)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Library

Was ist ein Library

Unter Library (Bibliothek) versteht man eine Sammlung von universell einsetzbaren Softwarebausteinen. Somit muss bei der Entwicklung nicht jede Funktion in jedem Programm wieder neu erfunden oder neu geschrieben werden, sondern man nutzt bei der Erstellung der Software schon fertig erprobte Funktion einer solchen Library. Zur Erstellung neuer Funktionen können somit Librarys mit fundamentalen Funktionen benutzt werden, und mehrere thematisch und logisch zusammenhängende neue Funktionen wiederum zu einer neuen Library zusammengestellt werden. Somit entstehen Hierarchien von Libraries und bei der Programmentwicklung kann man sich auf die Entwicklung des wirklich Neuem oder Einmaligem beschränken.


verschieden Typen von Library

Man unterscheidet :

Quelltextbibliotheken 

enthalten Sammlungen von Wertedefinitionen, Deklarationen, Funktionen, Klassen, generischen Bestandteilen, usw. In diesen Libraries befindet sich Quelltext in irgend einer Programmiersprache. Oftmals werden solche Bibliotheken genutzt um die Schnittstellen und Definitionen für andere Libraries zur Verfügung zu stellen. Solche Librarys werden nur während der Entwicklung und Übersetzung des Quellcodes in den ausführbaren Code benötigt. Zur Ausführung oder während der Laufzeit des fertigen Programmes werden diese Library nicht mehr benötigt.

Statische Bibliotheken 

bestehen schon aus ausführbarem Binärcode. Nach dem Kompiliervorganges des neuen Programmes, werden sie mittels eines so genannten Linker oder Binder mit dem ausführbaren Programm zu einem lauffähigem Programm vereint. Der Linker sucht aus den Bibliotheksdateien die Unterprogramme heraus, für die es im Programm keine Implementierung gibt. Diese werden dann aus den Dateien extrahiert und mit den Funktionen des Programms zu einer einzigen Datei verbunden. Man nennt das statisch gegen die Library linken. Jedes so entstandene Programm und somit auch jeder Prozess der durch das Starten eines solchen Programmes entsteht, hat also Teile der Library "im Bauch". Die Library an sich, wird zur Ausführung des Programmes nicht benötigt. Dieses Verfahren wird wegen des großen Speicherverbrauchs während der Laufzeit der Programme eher selten angewandt.

Dynamische Bibliotheken 

bestehen ebenfalls aus schon ausführbarem Binärcode. Die benötigten Objekte der Library werden aber nicht vom Linker in das neue Programm übernommen, sondern nur die Einsprungsmarke der benötigten Funktionen im Libray wird im Programm hinterlegt. Man spricht hier von dynamisch gegen die Library linken. Dynamische Bibliotheken werden bei Bedarf, also erst bei der Anforderung eines Programmes, komplett in den Arbeitsspeicher geladen und können dort von mehreren Programmen gleichzeitig genutzt werden. Dadurch muss eine Bibliothek, die von mehreren Programmen genutzt wird, nur einmal im Speicher gehalten werden, was einen bedeutenden Vorteil gegenüber statisch verlinkten Programmen bedeutet. Diese Library muss dann aber während des Startes der Programme im Linuxsystem auch verfügbar sein. Da aber mehrere Programme ein Library im Hauptspeicher benutzen können, muss die Verwaltung, das Laden und Entladen dieser Library von Linux selbst übernommen werden, und kann nicht von den Programmen selbst übernommen werden. Diese Funktion, sozusagen der dynamische Linker und Lader oder Library-Loader, erledigt in Linux ein Programm Namens ld.so .


Vor- und Nachteile von dynamischen Library

Neben dem schon angesprochenem Vorteil, daß eine Library im Speicher gleichzeitig von mehreren Programmen und Instanzen dieser Programme genutzt werden kann, was eine sehr effektive Hauptspeicherverwaltung begünstigt, gibt es noch einen riesen Vorteil gegenüber statisch verlinkten Programmen. Im Falle einer notwendigen Änderung innerhalb von Funktionen eines Libraries, muss im System nur diese Library ausgetauscht werden und nicht alle Programme, die gegen diese Library gelinkt sind, neu kompiliert und neu gelinkt werden. Den Vorteilen stehen aber auch einige Nachteile entgegen. Da eine Library zur Ausführung von Programmen oder anderen Libraries in einem System immer vorhanden sein muss, entstehen jede Menge Abhängigkeiten. Sicherlich hat das jeder schon einmal erlebt, und mach einer auch schon daran verzweifelt, die Installation eines neuen Programmes erfordert eine bestimmte Library und will man diese fehlende Library dann installieren, dann fordert diese Installation jetzt erstmal wiederum bestimmte Libraries usw..... Ein zweiter Nachteil wird schnell sichtbar, wenn man bedenkt, dass es nicht immer gelingt, daß neue Versionen einer Library immer 100% kompatibel zu ihrer Vorgängerversion sind. Somit muss man in einem Linuxsystem oftmals mehrere Versionen ein und des selben Library bevorraten, da die einzelnen Programm gegen bestimmte Versionen gelinkt sind und die Abhängigkeiten besagen, es muss mindestens diese Version sein, oder maximal diese Version oder genau diese Version der Library. Siehe auch hier das Problem mit der Standard-Library, die wohl wichtigste Library im System, gegen die alle anderen Libraries und Programme gelinkt sind.


Der dynamische Loader

Der dynamische Linker und Loader ld.so oder als Link darauf auch ld-linux.so ist das Programm in Linux welches die Verwaltung und das Laden der dynamischen Bibliotheken ermöglicht. Damit er selbst funktionieren kann, ist er statisch gegen die libc.so gelinkt. Damit jetzt die Libraries geladen werden können, muss folgendes geklärt sein. Welche Libraries stehen zum laden im System zur Verfügung, in welchen Verzeichnissen liegen diese oder müssen dazu durchsucht werden. Der ld.so hat also eine Konfiguration. Diese befindet sich in der Datei /etc/ld.so.conf und ist einfach aufgebaut. In ihr werden die Verzeichnisse eingetragen, in denen die Libraries zu finden sind. (die beiden Standard Verzeichnisse /lib und /usr/lib brauchen nicht mit angegeben werden). Daneben gibt es noch einige Variablen, in denen Verzeichnisse für Libraries eingetragen werden können, damit ld.so diese laden kann, das wird aber in aller Regel nur in Ausnahmefällen benötigt, wenn zB. eine neue Version eines Library getestet werden soll, anstatt dem, was normal auf dem Rechner installiert ist, siehe dazu die Manpage von ld.so Damit jetzt nicht bei jeder Anforderung eines Programmes das halbe System nach der Library durchsucht werden muss, wird eine Datenbank (cache) geführt, in der die vorhandenen Libraries mit ihrem Path eingetragen sind. Dieser Cache befindet sich in der Datei /etc/ld.so.cache. Das Programm das diesen Cache anlegt, aktualisiert und mit dessen Hilfe man auch den Inhalt anzeigen kann ist ldconfig.

Damit nun eine neu hinzugekommene Library von ld.so automatisch geladen werden kann, muss sie also zuerst einmal mit ldconfig in den cache eingetragen werden. Die Benutzung von ldconfig obliegt nur root. Wird als root der Befehl abgegeben (ohne irgendwelche Optionen) wird anhand der /etc/ld.so.conf die Verzeichnisse nach Libraries durchsucht und in die /etc/ld.so.cache eingetragen. Mit ldconfig -p kann man sich auch den Inhalt der /etc/ld.so.cache in lesbarer Form anzeigen lassen.


Namen und Verzeichnisse der Library

Jede Bibliothek braucht selbstverständlich auch einen eindeutigen Namen. So heißt beispielsweise

  • die Standard Bibliothek beispielsweise c
  • die Library mit den Mathematikfunktionen heißt einfach m
  • die Library für das dynamische Laden heißt dl

Auch wenn kurze Namen in aller Regel mal nicht schlecht sind, hier muss man im Namen noch etwas davor stellen, damit man auch erkennt, dass es sich um ein Library handelt, also wird den Namen die Silbe lib vorangestellt. So entstehen daraus die Library-Name libc libm libdl. Hinter diesem Namen folgt jetzt abgetrennt mit einem Punkt noch eine Erweiterung.

  • ( .so ) (engl.: shared object) für dynamische Library
  • ( .a ) (engl.: archive) für statische Library

und daran gegebenenfalls noch anschließen die Kennung der genauen Version dieser Library.

Am besten sehen wir das am Beispiel:

 
robi@LINUX:/usr/lib> ls -l  liba52.*
-rw-r--r--  1 root root 104658 2004-11-28 00:49 liba52.a
-rwxr-xr-x  1 root root    697 2004-11-28 00:49 liba52.la
lrwxrwxrwx  1 root root     15 2006-05-21 14:21 liba52.so -> liba52.so.0.0.0
lrwxrwxrwx  1 root root     15 2006-05-21 14:21 liba52.so.0 -> liba52.so.0.0.0
-rwxr-xr-x  1 root root  91103 2004-11-28 00:49 liba52.so.0.0.0
robi@LINUX:/usr/lib> file  liba52.*
liba52.a:        current ar archive
liba52.la:       ASCII English text
liba52.so:       symbolic link to `liba52.so.0.0.0'
liba52.so.0:     symbolic link to `liba52.so.0.0.0'
liba52.so.0.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped 

Es sind hier also die Dateien der Library a52 zu sehen.

  • die Datei liba52.a ist die statisch Library
  • die Datei liba52.so.0.0.0 ist die dynamische Library
  • die Datei liba52.la beinhaltet auch für uns lesbar spezielle Link Informationen für den Linker und Loader
  • liba52.so und liba52.so.0 sind Symbolische Links auf das dynamische Library.

Die genaue Benennung ist demnach liba52 Version 0.0.0


Die Library haben somit Versionsnummer im Dateinamen, aber Programme sind in der Regel gar nicht an einer bestimmten Version interessiert. Deshalb gibt es die symbolische Links.

Im obigem Beispiel kann ein Programm gegen liba52.so gelinkt werden, und wird auf die installierte Version liba52.so.0.0.0 umgeleitet. Wir eine neue Version dieser Library installiert, dann wird der Link liba52.so auf die neue Version gesetzt und das Programm kommt automatisch in den Genuss der neuen Version.

Natürlich ist es auch möglich, ein Programm gegen genau eine bestimmte Version zu linken, genau diese Version muss dann aber vorhanden sein, um das Programm zu starten. Dies ist mitunter sogar beabsichtigt, kann aber bei Updates auch zu Problemen führen, weil die Programme plötzlich nicht mehr starten oder mit Fehlermeldung abbrechen. Nun könnte man in einigen Fällen hier einfach manuell eingreifen und einfach die Links per Hand erzeugen oder anpassen, um somit Versionabhängigkeiten zu beseitigen. Das sollte man aber dringendst unterlassen, wenn man nicht genau weiß, was man hier macht und welche Auswirkungen das haben könnte.

Die Library befinden sich hauptsächlich in folgenden Verzeichnissen

  • /lib alle Libraries die schon beim Start von Linux benötigt werden
  • /usr/lib viele oder die meisten Libraries der Anwenderprogramme
  • /usr/local/lib Libraries local installierter Programme
  • /opt/kde3/lib die Libraries von KDE Programmen
  • /opt/gnome/lib die Libraries von Gnome Programmen
  • /opt/X11R6/lib die Libraries von X11-Programmen.

siehe auch dazu /etc/ld.so.conf die Konfigurationsdatei von ld.so


Welche Library braucht welches Programm

Gelegentlich, ist es wichtig herauszufinden welche Libraries ein Programm oder eine andere Library selbst benötigt, oder von welcher sie abhängig ist. Dieses kann man mit dem Befehl ldd. Dazu wird einfach ldd mit dem vollem Path des Programmes oder der Library aufgerufen. Und in der Ausgabe erscheinen die Abhängigkeiten von den Libraries.

robi@LINUX:~> ldd /bin/bash
        linux-gate.so.1 =>  (0xffffe000)
        libreadline.so.4 => /lib/libreadline.so.4 (0x4002e000)
        libhistory.so.4 => /lib/libhistory.so.4 (0x4005a000)
        libncurses.so.5 => /lib/libncurses.so.5 (0x40061000)
        libdl.so.2 => /lib/libdl.so.2 (0x400a7000)
        libc.so.6 => /lib/tls/libc.so.6 (0x400aa000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


Libraries und Programme mit Libraries manuell installieren und aktualisieren

Grundsätzlich ist es immer besser Programme über die vorgesehenen Paketinstallationsprogramme ( Smart , APT , YaST) zu installieren. In einigen wenigen Ausnahmefällen, wenn zB dieses Programm oder die spezielle Version davon, nirgends als Paket zur Verfügung steht, oder wenn das Programm mit speziellen Optionen benötigt wird, kommt man nicht drumherum das Programm manuell aus dem Quellcode selbst zu kompilieren.

Hierbei bekommt man jetzt die vollen Abhängikeiten der Programme von den Libraries besonders deutlich zu spüren. Der configure versucht die benötigten Library anzusprechen, und bricht mit Fehlermeldung ab, wenn das Library nicht vorhanden oder nicht geladen werden kann. Bei manuellen Installationen von Programmen mit Libraries muss also erst einmal ein ldconfig gemacht werden, damit ld.so das Library laden kann.

Bei der manuellen Installation gerät man leicht in eine Falle. Wird das Programm oder Library nur mit make install installiert, dann ist das Programm zwar installiert, doch wenn Programme jetzt mit dem Paketmanagern installiert werden sollen, die Abhängigkeiten zu den so manuell installierten Libraries haben , dann werden diese Libraries wiederum als fehlend an gemeckert, oder vom einem intelligentem Paketmanager noch einmal neu installiert. Das liegt daran, dass sich der Paketmanager darauf verlässt, dass immer jede Installation in die Datenbank des Paketmanagers eingetragen wird, und genau das macht make install nicht. Ist die manuelle Installation also nicht in der Datenbank des Paketmanagers vermerkt, kann der Paketmanager bei nachfolgenden Installationen/Deinstallationen die Abhängigkeiten nicht richtig erkennen oder auflösen.

Abhilfe schafft hier ein Programm namens checkinstall mit dessen Hilfe man ein manuell kompiliertes Programm als rpm-Paket installieren kann. Da das Programm dann letztendlich mit rpm installiert wird, wird auch gleich automatisch noch die /etc/ld.so.cache aktualisiert. Wird ein Programm oder manuelle erzeugten Library so installiert, dann können die Abhängigkeiten bei nachfolgenden Installationen vom Paketmanager richtig aufgelöst werden.

Und noch einen Vorteil hat die Nutzung von checkinstall, man kann durch Deinstallation des Paketes das Programm oder die Library auch wieder vollständig entfernen.

weiter Befehle rund um Libraries

Weiter Befehle die eine Rolle spielen bei der Erstellung von Libraries und Programmen oder um im Inneren solcher bestimmte Details zu suchen oder um zB auch mal die Debuginformationen aus einem Binary zu entfernen, um Speicher- oder Plattenplatz zu sparen, sind wohl nur für fortgeschrittene Linuxer von Interesse, hier in einer Übersicht der Manpages.



--Robi 12:55, 26. Okt 2006 (CEST)