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

14 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 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 POWER, IBM Z und AMD64/Intel 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 ppc für POWER sowie x86 für AMD64/Intel 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 POWER-System führt die meisten Anwendungen im 32-Bit-Modus aus, es können aber auch 64-Bit-Anwendungen ausgeführt werden.

14.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).

14.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 Werkzeugkette von GCC (GNU Compiler Collection) und Binutils, die den Assembler as und den Linker ld umfassen:

Mit einer Doppelarchitektur-Entwicklungswerkzeugkette (Biarch Development Toolchain) können sowohl 32-Bit- als auch 64-Bit-Objekte erstellt werden. Eine Doppelarchitektur-Entwicklungswerkzeugkette 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-Entwicklungswerkzeugkette für amd64 (unterstützt die Entwicklung von x86- und amd64-Anweisungen), für IBM Z und für POWER vorhanden. 32-Bit-Objekte werden in der Regel auf der POWER-Plattform erstellt. Zur Erstellung von 64-Bit-Objekten muss das Flag -m64 verwendet werden.

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.

14.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, 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 mit libaio auf einem System mit einer 32-Bit-Architektur (AMD64/Intel 64 oder IBM Z) als zweiter Architektur sind beispielsweise die folgenden RPMs erforderlich:

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 AMD64/Intel 64-System mit x86 als zweiter Architektur. Beispiele für POWER mit ppc als Zweitarchitektur wären ähnlich.

  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 AMD64/Intel 64, POWER oder IBM 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

14.4 Kernel-Spezifikationen

Die 64-Bit-Kernel für AMD64/Intel 64, POWER und IBM 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-POWER-Plattformen als 64-Bit-Programme kompiliert werden, damit sie ordnungsgemäß funktionieren. Bei IBM 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