Zum Inhalt springenZur Seitennavigation springen: vorherige Seite [Zugriffstaste p]/nächste Seite [Zugriffstaste n]
Bezieht sich auf SUSE Linux Enterprise Server 11 SP4

9 32-Bit- und 64-Bit-Anwendungen in einer 64-Bit-Systemumgebung

SUSE® Linux Enterprise Server ist für verschiedene 64-Bit-Plattformen verfügbar. Das bedeutet jedoch nicht unbedingt, dass alle enthaltenen Anwendungen bereits auf 64-Bit-Plattformen portiert wurden. SUSE Linux Enterprise Server unterstützt die Verwendung von 32-Bit-Anwendungen in einer 64-Bit-Systemumgebung. Dieses Kapitel bietet einen kurzen Überblick darüber, wie diese Unterstützung auf SUSE Linux Enterprise Server-64-Bit-Plattformen implementiert ist. Es wird erläutert, wie 32-Bit-Anwendungen ausgeführt werden (Laufzeitunterstützung) und wie 32-Bit-Anwendungen kompiliert werden sollten, damit sie sowohl in 32-Bit- als auch in 64-Bit-Systemanwendungen ausgeführt werden können. Außerdem finden Sie Informationen zur Kernel-API und es wird erläutert, wie 32-Bit-Anwendungen unter einem 64-Bit-Kernel ausgeführt werden können.

SUSE Linux Enterprise Server für die 64-Bit-Plattformen ia64, ppc64, System z und x86_64 ist so ausgelegt, dass vorhandene 32-Bit-Anwendungen ohne Änderungen in der 64-Bit-Umgebung ausführbar sind. Die entsprechenden 32-Bit-Plattformen sind 86 für ia64, ppc für ppc64 und x86 für x86_64. Diese Unterstützung bedeutet, dass Sie weiterhin Ihre bevorzugten 32-Bit-Anwendungen verwenden können und nicht warten müssen, bis ein entsprechender 64-Bit-Port verfügbar ist. Das aktuelle ppc64-System führt die meisten Anwendungen im 32-Bit-Modus aus, es können aber auch 64-Bit-Anwendungen ausgeführt werden.

9.1 Laufzeitunterstützung

Wichtig
Wichtig: Konflikte zwischen Anwendungsversionen

Wenn eine Anwendung sowohl für 32-Bit- als auch für 64-Bit-Umgebungen verfügbar ist, führt die parallele Installation beider Versionen zwangsläufig zu Problemen. Entscheiden Sie sich in diesen Fällen für eine der beiden Versionen und installieren und verwenden Sie nur diese.

Eine Ausnahme von dieser Regel ist PAM (Pluggable Authentication Modules). Während des Authentifizierungsprozesses verwendet SUSE Linux Enterprise Server PAM (austauschbare Authentifizierungsmodule) als Schicht für die Vermittlung zwischen Benutzer und Anwendung. Auf einem 64-Bit-Betriebssystem, das auch 32-Bit-Anwendungen ausführt, ist es stets erforderlich, beide Versionen eines PAM-Moduls zu installieren.

Für eine korrekte Ausführung benötigt jede Anwendung eine Reihe von Bibliotheken. Leider sind die Namen für die 32-Bit- und 64-Bit-Versionen dieser Bibliotheken identisch. Sie müssen auf andere Weise voneinander unterschieden werden.

Um die Kompatibilität mit der 32-Bit-Version aufrechtzuerhalten, werden die Bibliotheken am selben Ort im System gespeichert wie in der 32-Bit-Umgebung. Die 32-Bit-Version von libc.so.6 befindet sich sowohl in der 32-Bit- als auch in der 64-Bit-Umgebung unter /lib/libc.so.6.

Alle 64-Bit-Bibliotheken und Objektdateien befinden sich in Verzeichnissen mit dem Namen lib64. Die 64-Bit-Objektdateien, die sich normalerweise unter /lib und /usr/lib befinden, werden nun unter /lib64 und /usr/lib64 gespeichert. Unter /lib und /usr/lib ist also Platz für die 32-Bit-Bibliotheken, sodass der Dateiname für beide Versionen unverändert bleiben kann.

Unterverzeichnisse von 32-Bit-Verzeichnissen namens /lib, deren Dateninhalt nicht von der Wortgröße abhängt, werden nicht verschoben. Das Schema entspricht LSB (Linux Standards Base) und FHS (File System Hierarchy Standard).

ipf Die 64-Bit-Bibliotheken für ia64 befinden sich in Standard-lib-Verzeichnissen. Es gibt weder ein Verzeichnis lib64 noch ein Verzeichnis lib32. ia64 führt den 32-Bit-x86-Code unter einer Emulation aus. Eine Reihe von Basisbibliotheken wird unter /emul/ia32-linux/lib und /emul/ia32-linux/usr/lib installiert.

9.2 Software-Entwicklung

Alle 64-Bit-Architekturen unterstützen die Entwicklung von 64-Bit-Objekten. Der Grad der Unterstützung für die 32-Bit-Kompilierung ist von der Architektur abhängig. Dies sind die verschiedenen Implementierungsoptionen für die Toolkette von GCC (GNU Compiler-Sammlung) und Binutils, die den Assembler as und den Linker ld umfassen:

Doppelarchitektur-Compiler

Mit einer Doppelarchitektur-Entwicklungstoolkette können sowohl 32-Bit- als auch 64-Bit-Objekte erstellt werden. Eine Doppelarchitektur-Entwicklungswerkzeugkette (Biarch Development Toolchain) ermöglicht die Erstellung von 32-Bit- und 64-Bit-Objekten. Das Kompilieren von 64-Bit-Objekten gehört bei fast allen Plattformen zum Standard. 32-Bit-Objekte können erstellt werden, wenn spezielle Flags verwendet werden. Dieses spezielle Flag ist -m32 für GCC. Die Flags für die Binutils sind architekturabhängig, aber GCC überträgt die richtigen Flags an die Linker und Assembler. Zurzeit ist eine Doppelarchitektur-Entwicklungstoolkette für amd64 (unterstützt die Entwicklung von x86- und amd64-Anweisungen), System z und ppc64 vorhanden. 32-Bit-Objekte werden in der Regel auf der ppc64-Plattform erstellt. Zur Erstellung von 64-Bit-Objekten muss das Flag -m64 verwendet werden.

Keine Unterstützung

SUSE Linux Enterprise Server bietet keine Unterstützung für die direkte Entwicklung von 32-Bit-Software auf allen Plattformen. Zur Entwicklung von Anwendungen für x86 unter ia64 müssen Sie die entsprechende 32-Bit-Version von SUSE Linux Enterprise Server verwenden.

Alle Header-Dateien müssen in architekturunabhängiger Form geschrieben werden. Die installierten 32-Bit- und 64-Bit-Bibliotheken müssen eine API (Anwendungsprogrammschnittstelle) aufweisen, die zu den installierten Header-Dateien passt. Die normale SUSE Linux Enterprise Server-Umgebung ist gemäß diesem Prinzip konzipiert. Bei manuell aktualisierten Bibliotheken müssen Sie diese Probleme selbst lösen.

9.3 Software-Kompilierung auf Doppelarchitektur-Plattformen

Um bei einer Doppelarchitektur Binärdateien für die jeweils andere Architektur zu entwickeln, müssen die entsprechenden Bibliotheken für die zweite Architektur zusätzlich installiert werden. Diese Pakete heißen rpmname-32bit oder rpmname-x86 (für ia64), wenn die zweite Architektur eine 32-Bit-Architektur ist, oder rpmname-64bit, wenn die zweite Architektur eine 64-Bit-Architektur ist. Außerdem benötigen Sie die entsprechenden Header und Bibliotheken aus den rpmname-devel-Paketen und die Entwicklungsbibliotheken für die zweite Architektur aus rpmname-devel-32bit oder rpmname-devel-64bit.

Zum Kompilieren eines Programms, das libaio auf einem System verwendet, dessen zweite Architektur eine 32-Bit-Architektur ist (x86_64 oder System z), benötigen Sie beispielsweise die folgenden RPMs:

libaio-32bit

32-Bit-Laufzeitpaket

libaio-devel-32bit

Header und Bibliotheken für die 32-Bit-Entwicklung

libaio

64-Bit-Laufzeitpaket

libaio-devel

Header und Bibliotheken für die 64-Bit-Entwicklung

Die meisten Open Source-Programme verwenden eine autoconf-basierte Programmkonfiguration. Um mit autoconf ein Programm für die zweite Architektur zu konfigurieren, überschreiben Sie die normalen Compiler- und Linker-Einstellungen von autoconf, indem Sie das Skript configure mit zusätzlichen Umgebungsvariablen ausführen.

Das folgende Beispiel bezieht sich auf ein x86_64-System mit x86 als zweiter Architektur. Beispiele für ppc64 mit ppc als Zweitarchitektur wären ähnlich. Dieses Beispiel gilt nicht für ia64-Systeme, wo Sie keine 32-Bit-Pakete erstellen können.

  1. Verwenden Sie den 32-Bit-Compiler:

    CC="gcc -m32"
  2. Weisen Sie den Linker an, 32-Bit-Objekte zu verarbeiten (verwenden Sie stets gcc als Linker-Frontend):

    LD="gcc -m32"
  3. Legen Sie den Assembler für die Erstellung von 32-Bit-Objekten fest:

    AS="gcc -c -m32"
  4. Geben Sie die Linker-Flags an, wie zum Beispiel den Standort von 32-Bit-Bibliotheken:

    LDFLAGS="-L/usr/lib"
  5. Geben Sie den Standort für die 32-Bit-Objektcode-Bibliotheken an:

    --libdir=/usr/lib
  6. Geben Sie den Standort für die 32-Bit-X-Bibliotheken an:

    --x-libraries=/usr/lib

Nicht alle diese Variablen werden für jedes Programm benötigt. Passen Sie sie an das entsprechende Programm an.

Ein configure-Aufruf zur Kompilierung einer nativen 32-Bit-Anwendung auf x86_64, ppc64 oder System z könnte beispielsweise wie folgt aussehen:

CC="gcc -m32"
LDFLAGS="-L/usr/lib;"
./configure --prefix=/usr --libdir=/usr/lib --x-libraries=/usr/lib
make
make install

9.4 Kernel-Spezifikationen

Die 64-Bit-Kernel für x86_64, ppc64 und System z bieten sowohl eine 64-Bit- als auch eine 32-Bit-Kernel-ABI (binäre Anwendungsschnittstelle). Letztere ist mit der ABI für den entsprechenden 32-Bit-Kernel identisch. Das bedeutet, dass die 32-Bit-Anwendung mit dem 64-Bit-Kernel auf die gleiche Weise kommunizieren kann wie mit dem 32-Bit-Kernel.

Die 32-Bit-Emulation der Systemaufrufe für einen 64-Bit-Kernel unterstützt nicht alle APIs, die von Systemprogrammen verwendet werden. Dies hängt von der Plattform ab. Aus diesem Grund müssen einige wenige Anwendungen, wie beispielsweise lspci, auf Nicht-ppc64-Plattformen als 64-Bit-Programme kompiliert werden, damit sie ordnungsgemäß funktionieren. Bei IBM-System z sind nicht alle ioctls in der 32-Bit-Kernel-ABI verfügbar.

Ein 64-Bit-Kernel kann nur 64-Bit-Kernel-Module laden, die speziell für diesen Kernel kompiliert wurden. 32-Bit-Kernel-Module können nicht verwendet werden.

Tipp
Tipp: Kernel-ladbare Module

Für einige Anwendungen sind separate, Kernel-ladbare Module erforderlich. Wenn Sie vorhaben, eine solche 32-Bit-Anwendung in einer 64-Bit-Systemumgebung zu verwenden, wenden Sie sich an den Anbieter dieser Anwendung und an SUSE, um sicherzustellen, dass die 64-Bit-Version des Kernel-ladbaren Moduls und die kompilierte 32-Bit-Version der Kernel-API für dieses Modul verfügbar sind.

Diese Seite drucken