Wie führe ich 32-Bit-Programme auf 64-Bit-Fedora 17 aus?

10

Obwohl das ADT-Bundle (Android Development Tools) als Zip-Paket für 'Linux 64 Bit' verfügbar ist, enthält es folgende Anforderungen :

64-Bit-Distributionen müssen 32-Bit-Anwendungen ausführen können.

Tatsächlich führt das Ausführen der gepackten Eclipse auf einem Fedora 17 64-Bit-System zu Fehlern, da mehrere Entwicklungstools nicht gefunden werden können, z. B. adbOder aapt:

Fehler beim Ausführen von aapt: Das Programm "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt" kann nicht ausgeführt werden: error = 2, Keine solche Datei oder kein solches Verzeichnis: error = 2, Keine solche Datei oder kein solches Verzeichnis

Die 'keine solche Datei' ist irreführend, weil sie dort ist (unter $ HOME / local):

adt-bundle-linux/sdk/platform-tools/aapt

Aber ich kann es nicht auf der Shell ausführen:

~/local $ ./adt-bundle-linux/sdk/platform-tools/aapt 
zsh: no such file or directory: ./adt-bundle-linux/sdk/platform-tools/aapt

Blick auf die Datei

$ file adt-bundle-linux/sdk/platform-tools/aapt
adt-bundle-linux/sdk/platform-tools/aapt: ELF 32-bit LSB executable, Intel 80386,
 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8,
 not stripped

wir sehen, dass es eine 32-Binärdatei ist. Und es scheint, dass mein System (derzeit) keine 32-Bit-Anwendungen ausführen kann.

Wie ändere ich das? Wie mache ich ein aktuelles Fedora 64-Bit-System, das 32-Bit-Anwendungen ausführen kann?

(Natürlich könnte man auch fragen, warum jemand 32-Bit-Binärdateien in ein Binärpaket namens "Linux 64-Bit" einfügt ...)

maxschlepzig
quelle
Ähnliche Frage mit Antwort auf AskFedora: ask.fedoraproject.org/question/365/…
gertvdijk
Um zu verstehen, warum diese Meldung angezeigt wird
angezeigt

Antworten:

9

In Bezug darauf, dass Eclipse adbusw. nicht finden kann, liegt dies daran, dass sie ohne die 32-Bit-Shared-Libraries, die zum Ausführen auf dem System erforderlich sind, nicht ausführbar sind.

In Bezug auf 32-Bit-Bibliotheken ist die Situation recht einfach: Sie müssen nur die entsprechenden 32-Bit-Bibliotheken installieren. Bei der 64-Bit-Fedora 17-Installation, die ich hier habe, befinden sich die primären 64-Bit-Bibliotheken in / usr / lib64 und optionale 32-Bit-Bibliotheken in / usr / lib. Also, wenn ich lddsdk / platform-tools / adb aufrufe:

linux-gate.so.1 =>  (0xf7791000)
librt.so.1 => /lib/librt.so.1 (0xf776c000)
libncurses.so.5 => /lib/libncurses.so.5 (0xf7747000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf772d000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0xf7644000)
libm.so.6 => /lib/libm.so.6 (0xf7618000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf75fb000)
libc.so.6 => /lib/libc.so.6 (0xf7449000)
/lib/ld-linux.so.2 (0xf7792000)
libdl.so.2 => /lib/libdl.so.2 (0xf7444000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0xf7424000)

Beachten Sie, dass sich alle in / lib befinden, einem Symlink zu / usr / lib (nicht / usr / lib64). Aussehen:

»file /lib/libc.so.6
/lib/libc.so.6: symbolic link to `libc-2.15.so'
»file /lib/libc-2.15.so
/lib/libc-2.15.so: ELF 32-bit LSB shared object [...]

Eine 32-Bit-Standard-C-Bibliothek. Sie können die 32-Bit-SDK-Tools durchgehen und überprüfen, womit sie verknüpft sind ldd. Ich habe kein Beispiel zur Hand, aber wenn etwas fehlt ldd, wird Folgendes gemeldet:

libc.so.6 => ??????

Damit ldd funktioniert, benötigen Sie zunächst den 32-Bit-Loader, der mit dem 32-Bit-glibc geliefert wird (ohne dies nennt ldd es eine nicht ausführbare Datei und sagt Ihnen nichts):

»yum search glibc
glibc.i686 : The GNU libc libraries
glibc.x86_64 : The GNU libc libraries

Das ist abgeschnitten, aber das x86_64-Paket ist das, was Sie bereits haben. Der i686 ist die 32-Bit-Version. Installieren Sie das einfach.

Sie benötigen keines der 'devel'-Pakete, da nichts kompiliert wird. Darüber hinaus sollten fundierte Vermutungen und yum whatprovides/ oder yum searchHilfe hilfreich sein (in der Liste für adb finden Sie auch 32-Bit-Versionen der C ++ - Bibliothek, ncurses, pthreads und einige Dinge, die ich nicht kenne).

Schneller Tipp zur Verwendung von whatprovides:

»yum whatprovides libtinfo
No matches found.
»yum whatprovides libtinfo.so.5
[2 matches]
»yum whatprovides "*/libtinfo.so.5"
[4 matches]

;)

Goldlöckchen
quelle
ok, ich werde versuchen, die i686-Versionen der über angezeigten Bibliotheken zu installieren ldd. Aus dem Grund: Ich bin nicht überzeugt, filedie Bundle-Version von adbDisplays aufzurufen : ELF 32-Bit-LSB-ausführbare Datei, Intel 80386 - nichts mit ARM-Emulation zu tun - und / usr / bin / adb (aus dem Fedora-Paket für Android-Tools) ist tatsächlich als ausführbare ELF 64-Bit-LSB-Datei x86-64 verfügbar .
Maxschlepzig
Wenn ich ldd aufrufe adt-bundle-linux/sdk/platform-tools/adb, wird "keine dynamische ausführbare Datei" angezeigt . In Bezug auf den PFAD - dies ist nicht das Problem - funktioniert die vollständige Angabe des Pfads von z. B. ./adt-bundle-linux/sdk/platform-tools/adbin einem Terminal nicht (führt zu 'zsh: keine solche Datei oder kein solches Verzeichnis [..]').
Maxschlepzig
Haben Sie glibc.i686 schon installiert? Wie ich bereits sagte, benötigen Sie (wahrscheinlich) einen 32-Bit-Loader, damit ldd funktioniert, und das wird mit dem glibc-Paket geschehen. WRT adb ist ein 32-Bit- Intel- Bogen, weil das Ihr System ist und etwas, das für ARM kompiliert wurde, dort nicht funktioniert. Das gleiche 32-Bit-Material könnte jedoch für ARM kompiliert werden, und ich kann mir vorstellen, dass Teile davon auf Android-Geräten verwendet werden. Ich gebe zu, dass dies falsch sein könnte, aber auf jeden Fall ist es das, was verfügbar ist, und es ist nicht wirklich ein großer Aufwand.
Goldlöckchen
Schreiben Sie den Pfad, möglicherweise ist er für Eclipse nicht erforderlich, und (wie Sie sagen) wird möglicherweise der gleiche Fehler in der Befehlszeile angezeigt, wenn die Datei ohnehin nicht ausgeführt werden kann. Installieren Sie einfach die Bibliotheken usw., und Sie werden es herausfinden.
Goldlöckchen
2
Es gibt keine Beziehung zwischen dem Emulator als 32-Bit-Programm und der emulierten Plattform mit einem 32-Bit-Prozessor. Der Android-Emulator basiert in der Tat auf Qemu, das unabhängig von der Host-Architektur alle Funktionen von armv7 (32-Bit), armv8 (64-Bit), x86, amd64, mips, mips64 und vielen mehr emulieren kann.
Gilles 'SO - hör auf böse zu sein'
8

Sie müssen das 32-Bit-glibc installieren:

# yum install glibc.i686

Dadurch wird die irreführende Meldung "Keine solche Datei oder kein solches Verzeichnis" entfernt, wenn versucht wird, eine 32-Bit-Binärdatei auszuführen. Damit kann das 64-Bit-Fedora-System 32-Bit-Binärdateien ausführen.

Dadurch wird auch die irreführende Meldung "Keine dynamische ausführbare Datei" lddbeim Aufrufen lddeiner dynamischen 32-Bit-ausführbaren Datei entfernt.

Jetzt müssen Sie fehlende 32-Bit-Bibliotheken installieren, mit denen die Binärdateien adt-bundle-linux/sdk/platform-toolsverknüpft sind:

# yum install zlib.i686 libstdc++.i686 ncurses-libs.i686 libgcc.i686

Das ist es.

Hintergrund

Einige Hintergrundinformationen zum Ableiten der oben genannten Paketnamen. Zum Beispiel die Ausgabe von

$ ldd adb
linux-gate.so.1 =>  (0xf774f000)
librt.so.1 => /lib/librt.so.1 (0xf7725000)
libncurses.so.5 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0xf770b000)
libstdc++.so.6 => not found
libm.so.6 => /lib/libm.so.6 (0xf76df000)
    [..]

bedeutet, dass für adb noch 2 Bibliotheken fehlen.

Für jedes 'nicht gefunden' müssen wir den Paketnamen nachschlagen, zB:

$ yum whatprovides '*libstdc++.so.6'
[..]
libstdc++-4.7.2-2.fc17.i686 : GNU Standard C++ Library
[..]

Jetzt nehmen wir den Paketbasisnamen und fügen '.i686' hinzu, um die 32-Bit-Version zu erhalten.

maxschlepzig
quelle
Diese Antwort ist großartig, insbesondere der erste Teil - tatsächlich glibc.i686ermöglicht die Installation ldddas ordnungsgemäße Arbeiten mit i386-Binärdateien.
Krystian
2

Sie können das erforderliche Paket installieren mit:

sudo yum install redhat-lsb.i686
xwindows
quelle