Inhaltsverzeichnis
Beschreibung: Prüfungskandidaten sollten in der Lage sein, Shared Libraries, die von ausführbaren Programmen benötigt werden, zu bestimmen und nötigenfalls zu installieren. Sie sollten ebenfalls fähig sein, anzugeben wo sich die Systembibliotheken befinden.
Die wichtigsten Dateien, Bezeichnungen und Anwendungen:
- ldd
- ldconfig
- /etc/ld.so.conf
- LD_LIBRARY_PATH
Shared Libraries sind Funktionsbibliotheken, die von mehreren Programmen benutzt werden können und die so nur einmal in den Speicher geladen werden müssen, anstatt für jedes Programm extra Platz zu verschwenden. Normalerweise würde ein Programm beim Linkvorgang (dem Vorgang, bei dem alle Objektdateien und die Systemlibraries zur ausführbaren Datei zusammengefügt werden) mit allen Libraries, aus denen das Programm Funktionen benötigt, statisch gelinkt. Das würde aber bedeuten, daß Programme, die gleichzeitig laufen, diese Funktionsbibliotheken – jedes Programm für sich – in den Speicher laden müsste. Die shared library Technik verhindert das. Ein Programm, das geladen wird, überprüft, ob die notwendigen Libraries schon im Arbeitsspeicher liegen. Zun sie das, so läd sich das Programm in den Arbeitsspeicher und benutzt einfach die schon geladenen Libraries. Liegen die benötigten Libraries noch nicht im Arbeitsspeicher, so werden sie zunächst geladen und erst dann läd sich das Programm.
So wird jede benötigte Library nur einmal in den Speicher geladen, was gerade in einem System, das viele Programme gleichzeitig geladen hält eine enorme Speichereinsparung bewirkt.
Wenn ein Programm geladen wird, dann muß es eine Instanz geben, die den geschilderten Vorgang startet. Denn das Programm selbst kann das nicht tun, es wird ja erst geladen, wenn die nötigen Libraries auch schon geladen sind. Diese Instanz ist sozusagen der Programmlader oder der sogenannte dynamische Linker und Lader. Der Name dieses Programms ist ld.so.
ld.so läd die shared libraries, die ein Programm benötigt, bereitet dann das Programm entsprechend vor und läd es selbst. Die shared libraries, die das zu ladende Programm benötigt, werden in der folgenden Reihenfolge gesucht:
- Alle Pfade, die in der Umgebungsvariable LD_LIBRARY_PATH eingetragen sind, werden nach den Libraries durchsucht. LD_LIBRARY_PATH ist eine Shellvariable, die eine durch Doppelpunkte getrennte Liste von Verzeichnissen enthält.
- Die Datei /etc/ld.so.cache enthält eine binäre Liste aller Librarie-Kandidaten, die schon vorher in den genannten Verzeichnissen gefunden wurden. (siehe weiter unten bei ldconfig.)
- Die Verzeichnisse /usr/lib und /lib oder /usr/local/lib werden durchsucht.
Ein Linux-Programm wird also von einem speziellen Programmlader (ld.so) geladen, der die notwendigen Libraries gleich mitläd. Aus diesem Grund ist es nötig, daß jedes Programm, das installiert wird, auch die entsprechenden Libraries mitinstalliert bzw. überprüft, ob sie schon installiert sind. Die Verwaltung dieser Libraries obliegt der Systemverwaltung.
Welches Programm braucht welche Library?
Um herauszufinden, welche Shared Libraries ein bestimmtes Programm benutzt, gibt es das kleine Programm ldd. Dieses Programm gibt eine Liste aller Libraries zurück, die das Programm benötigt, daß als Parameter ldd mitgegeben wurde. Um z.B. herauszubekommen, welche Libraries das Programm ls benötigt, schreiben wir
Syntax von ldd
ldd [OPTION] … FILE ….
--version - Zeigt die Versionsnummer von ldd.
-v --verbose
- Gibt erweitere Informationen und Beispiele an.
-u --unused
- Zeigt nicht genützte direct dependencies. (Seit der Verison glibc 2.3.4.)
-d --data-relocs
Perform relocations and report any missing objects (ELF only).
-r --function-relocs
Perform relocations for both data objects and functions, and report any missing objects or functions (ELF only).
--help Gibt Hilfe Informationen aus.
Mittels der Man Page von ldd findet man weitere Informationen. Hier noch eine Beispiel Ausgabe anhand dem Programm: /bin/ls
ldd /bin/ls
Das zu untersuchende Programm muß mit vollem Pfad angegeben werden. Die Ausgabe wäre für unser Beispiel dann etwas in der Art:
linux-vdso.so.1 => (0x00007ffdf97f5000) libselinux.so.1 => /lib64/libselinux.so.1 (0x000000358f000000) librt.so.1 => /lib64/librt.so.1 (0x000000358e000000) libcap.so.2 => /lib64/libcap.so.2 (0x0000003593800000) libacl.so.1 => /lib64/libacl.so.1 (0x0000003597000000) libc.so.6 => /lib64/libc.so.6 (0x000000358d400000) libdl.so.2 => /lib64/libdl.so.2 (0x000000358dc00000) /lib64/ld-linux-x86-64.so.2 (0x00007f70836bb000) libpthread.so.0 => /lib64/libpthread.so.0 (0x000000358d800000) libattr.so.1 => /lib64/libattr.so.1 (0x000000359c400000)
Daraus geht hervor, daß das Programm ls vom Linker/Loader /lib/ld-linux.so.2 gestartet werden will und die Libraries librt.so.1, libc.so.6 und libpthread.so.0 benötigt. In der rechten Spalte sind die Fundorte der Libraries im Dateisystem zu lesen.
Wenn ein Programm neu installiert wird, so kann mit Hilfe dieses Befehls herausgefunden werden, ob alle Libraries für das Programm existieren oder ob einige nachinstalliert werden müssen.
Libraries installieren und aktualisieren – ldconfig
Wenn neue Libraries installiert werden sollen, dann stellt sich die Frage, wohin. Zunächst einmal bieten sich die Verzeichnisse /lib, /usr/lib und /usr/local/lib an. Sollen aber neue Verzeichnisse angelegt werden, die Libraries enthalten, dann muß das der internen Verwaltung der Libraries mitgeteilt werden.
Die interne Verwaltung der Libraries wird durch den Aufruf des Programms ldconfig vollzogen. Dieses Programm wartet den Library Cache und erstellt automatisch die notwendigen symbolischen Links auf Libraries. Der Librarie-Cache liegt in der Datei /etc/ld.so.cache und enthält eine binär codierte Liste aller dem System bekannten Libraries.
Syntax von ldconfig:
ldconfig [OPTIONEN] [VERZEICHNIS|BIBLIOTHEK]
Optionen | |
-p | Zeigt den Inhalt der aktuellen Cache-Datei an, anstatt sie zu erstellen (print) / Root Rechte werden benötigt |
-v | Ausführliche Informationen während der Ausführung (verbose) |
Ldconfig versucht, den Typ einer ELF Bibliotheken (z. B. libc 5.x oder libc 6.x (glibc)) auf der Grundlage der Bibliotheken abzuleiten., sollte eine Bibliothek mit der Bibliothek verknüpft wurde. Der Befehl ldconfig muss mit Root Rechten oder sudo ausgeführt werden, da in Verzeichnisse und Dateien schreibberechtigung benötigt werden, die nur der User Root ändern darf. Die Ausnahme ist mit der Option -r. Mit dieser Option ändert man auf eine beliebiges Stammverzeichnis, wo man selber schreib berechtigt ist.
Hilfe findet man mit der Option –help – Ausgabe:
Usage: ldconfig [OPTION...] Configure Dynamic Linker Run Time Bindings. -c, --format=FORMAT Format to use: new, old or compat (default) -C CACHE Use CACHE as cache file -f CONF Use CONF as configuration file -i, --ignore-aux-cache Ignore auxiliary cache file -l Manually link individual libraries. -n Only process directories specified on the command line. Don't build cache. -N Don't build cache -p, --print-cache Print cache -r ROOT Change to and use ROOT as root directory -v, --verbose Generate verbose messages -X Don't generate links -?, --help Give this help list --usage Give a short usage message -V, --version Print program version
Damit ldconfig diese Datei erstellen kann und auch neu hinzugekommene Libraries dort aufgenommen werden, muß ldconfig wissen, welche Verzeichnisse nach Libraries durchsucht werden sollen. ldconfig durchsucht zunächst die beiden Verzeichnisse /usr/lib und /lib, danach alle Verzeichnisse, die in der Datei /etc/ld.so.conf aufgelistet sind.
Der Inhalt von /etc/ld.so.conf sieht unter CentOs 7 folgendermaßen aus:
include ld.so.conf.d/*.conf
Wenn also ein neues Programm foo installiert wird, das seine Shared Libraries im Verzeichnis /usr/local/foo/lib ablegt, so müssen wir nur dieses Verzeichnis in die Datei /etc/ld.so.conf aufnehmen. Nach der Installation neuer Libraries und/oder der Neuaufnahme von Pfaden in der Datei /etc/ld.so.conf muß das Programm ldconfig ausgeführt werden, bevor die neuen Libraries verwendet werden können. Erst nach dem Aufruf von ldconfig stehen sie ja in der Datei /etc/ld.so.cache und sind somit dem Linker/Loader bekannt.
Der Inhalt von der Binärdatei ld.socache ist nicht lesbar und sieht folgendermaßen aus.
▒:▒O▒a▒~▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒&▒=▒P▒n▒|▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒+▒6▒J▒`▒▒▒▒▒▒▒▒▒▒▒▒▒▒&▒?▒N▒h▒~▒▒▒▒▒▒▒▒▒ ▒ ▒>▒Z▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒(▒'▒6▒B▒U▒b▒z▒▒▒▒▒▒▒▒▒▒▒▒*▒J▒_▒▒▒▒▒▒▒▒▒▒:▒M▒k▒|▒▒▒▒▒▒▒▒▒▒▒ )▒8▒R▒v▒▒▒▒▒▒▒▒▒▒▒2▒E▒c▒x▒▒▒▒▒▒▒▒▒▒▒▒▒+▒@▒M▒a▒s▒▒▒▒▒▒▒▒▒▒▒▒▒▒"▒8▒D▒[▒n▒▒▒▒▒▒▒▒▒▒ ▒(▒8▒S▒e▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒)▒A▒L▒b▒n▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒!▒-▒D▒U▒q▒|▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒*▒8▒Q▒a▒|▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒+▒C▒R▒h▒w▒▒▒▒▒▒▒▒▒▒▒▒▒▒,▒O▒b▒▒▒▒▒▒▒▒▒▒▒▒▒▒#▒@▒N▒g▒y▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒,▒9▒Q▒]▒t▒▒▒▒▒▒▒▒▒▒▒▒▒&▒=▒O▒l▒▒▒▒▒▒▒▒▒▒▒▒▒▒,▒:▒M▒b▒p11-kit-tru st.so/usr/lib64/p11-kit-trust.solibz.so.1/lib64/libz.so.1libxul.so/usr/lib64/xul runner/libxul.solibxtables.so.4/lib64/libxtables.so.4libxslt.so.1/usr/lib64/libx slt.so.1libxshmfence.so.1/usr/lib64/libxshmfence.so.1libxpcom.so/usr/lib64/xulru nner/libxpcom.solibxml2.so.2/usr/lib64/libxml2.so.2libxmlsec1.so.1/usr/lib64/lib xmlsec1.so.1libxmlsec1-openssl.so.1/usr/lib64/libxmlsec1-openssl.so.1libxmlsec1- openssl.so/usr/lib64/libxmlsec1-openssl.solibxmlrpc_util.so.3/usr/lib64/libxmlrp c_util.so.3libxmlrpc_server_cgi.so.3/usr/lib64/libxmlrpc_server_cgi.so.3libxmlrp c_server_abyss.so.3/usr/lib64/libxmlrpc_server_abyss.so.3libxmlrpc_server.so.3/u sr/lib64/libxmlrpc_server.so.3libxmlrpc_client.so.3/usr/lib64/libxmlrpc_client.s o.3libxmlrpc_abyss.so.3/usr/lib64/libxmlrpc_abyss.so.3libxmlrpc.so.3/usr/lib64/l ibxmlrpc.so.3libxklavier.so.15/usr/lib64/libxklavier.so.15libxkbfile.so.1/usr/li b64/libxkbfile.so.1libxcb.so.1/usr/lib64/libxcb.so.1libxcb-xvmc.so.0/usr/lib64/l ibxcb-xvmc.so.0libxcb-xv.so.0/usr/lib64/libxcb-xv.so.0libxcb-xtest.so.0/usr/lib6 4/libxcb-xtest.so.0libxcb-xselinux.so.0/usr/lib64/libxcb-xselinux.so.0libxcb-xkb .so.1/usr/lib64/libxcb-xkb.so.1libxcb-xinput.so.0/usr/lib64/libxcb-xinput.so.0li bxcb-xinerama.so.0/usr/lib64/libxcb-xinerama.so.0libxcb-xf86dri.so.0/usr/lib64/l ibxcb-xf86dri.so.0libxcb-xfixes.so.0/usr/lib64/libxcb-xfixes.so.0libxcb-xevie.so .0/usr/lib64/libxcb-xevie.so.0libxcb-util.so.1/usr/lib64/libxcb-util.so.1libxcb- sync.so.1/usr/lib64/libxcb-sync.so.1libxcb-shm.so.0/usr/lib64/libxcb-shm.so.0lib xcb-shape.so.0/usr/lib64/libxcb-shape.so.0libxcb-screensaver.so.0/usr/lib64/libx cb-screensaver.so.0libxcb-res.so.0/usr/lib64/libxcb-res.so.0libxcb-reply.so.1/us r/lib64/libxcb-reply.so.1libxcb-render.so.0/usr/lib64/libxcb-render.so.0libxcb-r ecord.so.0/usr/lib64/libxcb-record.so.0libxcb-randr.so.0/