Über 32-Bit-Programme auf 64-Bit-Ubuntu und gemeinsam genutzte Bibliotheken

von Markus Bertheau, aktualisiert am 5. Dezember 2009 Kommentieren »
Schnelle Antwort

Um 32-Bit-Programme auf 64-Bit-Installationen von Ubuntu auszuführen, installiere das Paket ia32-libs:

markus@ubuntu:~$ sudo apt-get install ia32-libs

Lange Geschichte

Ich habe diesen Artikel geschrieben, um deine Kenntnisse und dein Verständnis davon, wie Linux funktioniert, zu erweitern. Diese Kenntnisse sollen deine Fähigkeiten zur Problemlösung im Bereich Serveradministration und Benutzung der Kommandozeile verbessern. Ich zeige, wie ich ein Shell-Skript zur Installation eines kommerziellen Softwarepakets, Flash® Media Server, das für RedHat Linux geschrieben wurde, an 64-Bit Ubuntu Linux angepasst habe. Für jedes Symptom, das dabei aufgetaucht ist, erkläre ich das Problem und wie man es löst. Das Endergebnis kann man im Artikel Flash® Media Server auf Ubuntu Linux installieren sehen.

Dieser Artikel ist der erste Teil einer Serie zu diesem Thema. Ich schreibe in ihm darüber, wie 32-Bit-Programme auf 64-Bit-Betriebssystemen ausgeführt werden und über das Konzept der gemeinsam genutzen Bibliotheken (shared libraries).

Die genauen Versionen der Software, die ich hier im Folgenden benutze, sind Ubuntu 8.04 LTS 64-Bit Server und Flash® Media Server 3.5.2, falls du den Artikel direkt nachvollziehen möchtest.

32 Bit auf 64 Bit

Wenn du den unveränderten Installer ausführst, bekommst du eine Fehlermeldung darüber, dass die Datei fmsini nicht gefunden wurde:

markus@ubuntu:~$ tar xfz FlashMediaServer3.5.tar.gz
markus@ubuntu:~$ sudo FMS_3_5_2_r654/installFMS
FMS_3_5_2_r654/installFMS: 172: FMS_3_5_2_r654/fmsini: not found

Diese Fehlermeldung ist ziemlich irreführend. Die Datei fmsini existiert und es ist eine ausführbare Datei für 32 Bit:

markus@ubuntu:~$ file FMS_3_5_2_r654/fmsini 
fmsini: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux
2.2.5, dynamically linked (uses shared libs), stripped

Warum dann die Fehlermeldung “not found“?

Die Meldung bezieht sich nicht auf die Datei fmsini, sondern auf ein spezielles Hilfsprogramm, das benötigt wird, um die 32-Bit dynamisch gelinkte ausführbare Datei fmsini auszuführen.

Statisches und dynamisches Linken

Es gibt zwei Typen von binären ausführbaren Dateien: statisch gelinkte und dynamisch gelinkte. Zuerst über die statisch gelinkten: Wenn ein Programm eine Bibliotheksfunktion aufrufen will, tut es das über ihren Namen. Wenn das Programm aus dem Quellcode erstellt wird, werden alle Bibliotheksfunktionen, die in dem Programm benutzt werden, von der Bibliothek ins Programm kopiert. Das Programm enthält dann seinen eigenen Code sowie den Code der Bibliotheksfunktionen, die es benutzt. Danach wird an den Stellen, an denen eine Bibliotheksfunktion aufgerufen wird, der Name der Bibliotheksfunktion mit ihrer Adresse im Programm ersetzt. Diesen Vorgang nennt man Linken, weil er die Namen der Funktionen mit der Funktion selber, ihrer Implementation, verknüpft (linkt). Der Vorgang heißt statisch, weil die Verbindung nicht mehr geändert werden kann, nachdem das Programm aus dem Quellcode erstellt wurde.

Dynamisch gelinkte Programme funktionieren anders: Das Programm bezieht sich auf Bibliotheksfunktionen genauso mit ihren Namen. Wenn das Programm aus dem Quellcode erstellt wird, werden zwei Listen erstellt: eine Liste darüber, welche Bibliotheksfunktionen an welchen Stellen im Programm benutzt werden, und eine Liste der Bibliotheken, die die benutzten Funktionen enthalten. Damit ist das Programm fertig.

Später, wenn das Programm ausgeführt wird, sucht ein Hilfsprogramm, der sogenannte dynamische Linker, an bestimmten Stellen im Dateisystem nach jeder Bibliothek in der Liste und lädt sie in den Arbeitsspeicher. Jetzt weiß der dynamische Linker an welcher Speicheradresse die Bibliotheksfunktionen zur Verfügung stehen. Er benutzt die erste Liste um im Programm die richtigen Adressen an die Stellen zu schreiben, an denen Bibliotheksfunktionen aufgerufen werden. Dann kann das dynamisch gelinkte Programm ausgeführt werden.

Vor- und Nachteile

Der größte Nachteil von statisch gelinkten ausführbaren Dateien liegt im nicht realisierten Potenzial zur gemeinsamen Benutzung durch mehrere Programme. Als Folge sind Programme erstens größer und brauchen mehr Platz auf der Festplatte und im Arbeitsspeicher. Dieser zusätzliche Platz ist oft mit wieder und wieder den selben Bibliotheksfunktionen belegt, weil sie in einer Menge von Programmen benutzt werden. Zweitens muss nach einem Sicherheits- oder Fehlerbehebungsupdate der Bibliothek das Programm neu aus dem Quellcode erstellt und zum Anwender gebracht werden, was sehr aufwendig sein kann.

Dynamisch gelinkte ausführbare Dateien lösen diese Probleme: Gemeinsam genutzte Bibliotheken existieren ein Mal auf der Festplatte und ein Mal im Arbeitsspeicher. Die Programme selbst sind kleiner, weil sie keinen Bibliothekscode enthalten. Bibliotheken können unabhängig von den Programmen, die sie benutzen, aktualisiert werden. Die Programme selber müssen nicht verändert werden, sondern nur neu gestartet.

Dynamisches Linken bringt aber auch Nachteile: Es ist mehr Infrastrutktur nötig um gemeinsam genutzte Bibliotheken zu unterstützen: die Bibliotheken selbst in der richtigen Version und ein komplizierterer Programmlader. In einigen Situationen wiegen diese Nachteile zu schwer, so dass statisch gelinkte Programme benutzt werden. Diese brauchen nur sich selbst um ausgeführt zu werden und haben keine Abhängigkeiten und Kompatibilitätsprobleme.

Der dynamische Linker

Der dynamische Linker hat eine man-Seite: ld.so(8). Bis 1995/96 hieß der dynamische Linker in Linux ld.so. Jetzt ist die 32-Bit-Version in /lib/ld-linux.so.2, und die 64-Bit-Version in /lib64/ld-linux-x86-64.so.2. Die man-Seite hat den alten Namen beibehalten.

Die 64-Bit-Version von Ubuntu Linux kann ab Werk statisch gelinkte 32-Bit-Programme ausführen. Der dynamische Linker für 32-Bit-Programme ist aber standardmäßig nicht installiert. Er ist im Paket libc6-i386. Nach man dieses Paket installiert hat, existiert die Datei /lib/ld-linux.so.2, und der erste Schritt hin zu funktionierenden 32-Bit dynamisch gelinkten Programmen ist getan.

Gemeinsam genutzte Bibliotheken (shared libraries)

Nachdem du libc6-i386 installiert hast, bekommst du eine andere Fehlermeldung, wenn du versuchst, fmsini auszuführen:

markus@ubuntu:~$ FMS_3_5_2_r654/fmsini
FMS_3_5_2_r654/fmsini: error while loading shared libraries: libstdc++.so.6:
cannot open shared object file: No such file or directory

Die Meldung kommt vom dynamischen Linker, der versucht hat, alle Bibliotheken in der Liste zu laden, und dabei eine nicht finden konnte.

Bibliotheken, die von dynamisch gelinkten Programmen benutzt werden, heißen gemeinsam genutzte Bibliotheken (shared libraries). Wenn der dynamische Linker feststellt, dass eine bestimmte Bibliothek bereits geladen wurde, kann er das neue Programm darauf verweisen, anstatt die Bibliothek ein zweites Mal zu laden. So wird eine Bibliothek, die einmal geladen wurde, von mehreren Programmen gemeinsam genutzt.

Gemeinsam genutzte Bibliotheken befinden sich in Dateien, die .so in ihrem Namen haben. so steht für shared object (gemeinsam genutztes Objekt). “Objekt” meint dabei einfach kompilierten, binären Code.

ldd(1) zeigt an, welche gemeinsam genutzten Bibliotheken ein Programm benötigt, und wo der dynamische Linker sie gefunden hat, falls er das hat:

markus@ubuntu:~$ ldd FMS_3_5_2_r654/fmsini
	linux-gate.so.1 =>  (0xf7fc8000)
	libpthread.so.0 => /lib32/libpthread.so.0 (0xf7fa0000)
	libdl.so.2 => /lib32/libdl.so.2 (0xf7f9c000)
	libstdc++.so.6 => not found
	libm.so.6 => /lib32/libm.so.6 (0xf7f75000)
	libgcc_s.so.1 => not found
	libc.so.6 => /lib32/libc.so.6 (0xf7e12000)
	/lib/ld-linux.so.2 (0xf7fc9000)

Der dynamische Linker sucht in einer Reihe von Verzeichnissen nach Bibliotheken – die man-Seite geht darauf detailliert ein. Die beiden fehlenden Bibliotheken sind in den Paketen lib32stdc++6 und lib32gcc1.

ldd ist übrigens nur ein Shell-Skript, das den dynamischen Linker aufruft. Wenn man ihm nichts anderes sagt, lädt der dynamische Linker alle Bibliotheken und führt das Programm aus. ldd ruft den dynamischen Linker mit Argumenten auf, die ihn anweisen, Informationen über die vom Programm benötigten gemeinsam genutzten Bibliotheken auszugeben.

Heutzutage ist die Mehrheit der Programme dynamisch gelinkt und benutzt gemeinsam genutzte Bibliotheken. Die Installation von Ubuntu hat über 400 gemeinsam genutzte 64-Bit-Bibliotheken. Das Paket ia32-libs in Ubuntus Universe-Repository enthält die am häufigsten gebrauchten gemeinsam genutzten Bibliotheken als 32-Bit-Version. Wenn dieses Paket installiert ist, läuft eine Menge 32-Bit-Programme auf 64-Bit-Ubuntu. Insbesondere läuft auch der Installer des Flash® Media Server durch (aus anderen Gründen funktioniert er aber noch nicht richtig). Der Flash® Media Server selbst braucht allerdings noch Bibliotheken, die nicht in dem Paket enthalten sind. Wie dieses Problem gelöst wird, ist ein Thema eines späteren Teils dieser Serie.

Feedback

Feedback ist extrem wichtig für mich, weil es mir Hinweise darauf gibt, was ich anders machen muss und was ich beibehalten sollte um mein Ziel zu erreichen. Mein Ziel ist, dass dieser Artikel für dich interessant und nützlich ist, wie im ersten Absatz beschrieben. Zögere nicht, einen Kommentar dazu zu hinterlassen, welche Abschnitte schwer verständlich geschrieben sind, was hätte weggelassen werden können und was gefehlt hat. Ich würde auch gern von dir hören, falls es in diesem Artikel etwas gab, was du als besonders gelungen bezeichnen könntest. Danke :)

Share

Freiwillige Bezahlung

Falls dir dieser Artikel geholfen hat oder dir Zeit oder Geld spart, und du gern dafür bezahlen möchtest, schau dir die Bezahlen-Seite an.

Werbung

4 Kommentare

  1. Hey Markus, endlich mal ein vielversprechender Artikel der mir durchaus helfen kann, endlich den Darwin Streaming Server auf einem 64Bit Ubuntu 8.04 TLS ans Laufen zu bekommen. Vielen Dank dafür! Ob es tatsächlich was hilft, weiss ich noch nicht. Aber in jedem Fall ist das hier schonmal deutlich mehr als alles was ich zu dem Thema bisher finden konnte.

  2. Markus Bertheau sagt:

    Danke, es freut mich, dass ich helfen konnte :) Wenn du noch etwas Zeit ins Land gehen lassen kannst, habe ich mir bis dahin vielleicht auch den Darwin Streaming Server angeguckt.

  3. Das habe ich schon für Dich getan. Unter Anderem auch aufgrund Deines obigen Artikels konnte ich dann endlich erfolgreich den Darwin Streaming Server unter einem 64Bit Ubuntu in Betrieb nehmen: http://zweitesleben.net/tutorials/live-video-streaming-in-sl-darwin-streaming-server-64bit-t1286.html

Hinterlasse eine Antwort

© 2017 Markus Bertheau. All rights reserved.