Shared Libraries


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

Die Technik der Shared Libraries

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)

Mit LDD prüfen, welche Abhängikeiten ein Programm unter Linux hat

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
-pZeigt den Inhalt der aktuellen Cache-Datei an, anstatt sie zu erstellen (print) / Root Rechte werden benötigt
-vAusfü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/

Schreibe einen Kommentar