Jak uruchomić 32-bitowe programy na 64-bitowej Fedorze 17?


10

Chociaż pakiet narzędzi programistycznych dla systemu Android (ADT) jest dostępny jako pakiet zip dla „Linuksa w wersji 64-bitowej”, określa następujące wymagania :

Dystrybucje 64-bitowe muszą obsługiwać aplikacje 32-bitowe.

I rzeczywiście, samo uruchomienie spakowanego zaćmienia w 64-bitowym systemie Fedora 17 powoduje błędy, ponieważ nie może „znaleźć” kilku narzędzi programistycznych, np. adbLub aapt:

Błąd podczas wykonywania aapt: Nie można uruchomić programu "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": error = 2, Brak takiego pliku lub katalogu: error = 2, Brak takiego pliku lub katalogu

„Brak takiego pliku” wprowadza w błąd, ponieważ istnieje (w katalogu $ HOME / local):

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

Ale nie mogę wykonać go na powłoce:

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

Patrząc na plik

$ 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

widzimy, że jest to 32 binarny. I wydaje się, że mój system (obecnie) nie jest w stanie uruchomić aplikacji 32-bitowych.

Jak to zmienić? Jak sprawić, by bieżący 64-bitowy system Fedory mógł uruchamiać aplikacje 32-bitowe?

(Oczywiście można również zapytać, dlaczego ktoś umieszcza 32-bitowe pliki binarne w pakiecie binarnym o nazwie „Linux 64 bit” ...)


Podobne pytanie z odpowiedzią na AskFedora: ask.fedoraproject.org/question/365/…
gertvdijk,

Odpowiedzi:


9

W związku z niemożnością znalezienia zaćmienia adbitp., Ponieważ bez 32-bitowych bibliotek współdzielonych potrzebnych do uruchomienia ich w systemie, nie są one wykonywalne.

W przypadku bibliotek 32-bitowych sytuacja jest dość prosta: wystarczy zainstalować odpowiednie biblioteki 32-bitowe. Na 64-bitowej instalacji fedora 17, którą tu mam, podstawowe 64-bitowe biblioteki znajdują się w / usr / lib64, a opcjonalne 32-bitowe biblioteki lib znajdują się w / usr / lib. Więc jeśli zadzwonię lddna sdk / platform-tools / adb:

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)

Zauważ, że wszystkie są w / lib, które jest dowiązaniem symbolicznym do / usr / lib (nie / usr / lib64). Popatrz:

»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 [...]

32-bitowa standardowa biblioteka C. Co możesz zrobić, to przejrzeć 32-bitowe narzędzia SDK i sprawdzić, z czym są połączone ldd. Nie mam podanego przykładu, ale jeśli czegoś brakuje, lddzgłasza coś takiego:

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

Po pierwsze , aby ldd działał, będziesz potrzebował 32-bitowego programu ładującego, który jest dostarczany z 32-bitowym glibc (bez tego ldd nazwie go plikiem niewykonywalnym i nic ci nie powie):

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

To jest obcięte, ale pakiet x86_64 jest już tym, co już masz; i686 to wersja 32-bitowa. Więc po prostu to zainstaluj.

Nie potrzebujesz żadnego z pakietów „devel”, ponieważ nic się nie kompiluje. Poza tym, wykształcone domysły i yum whatprovides/ yum searchpowinny pomóc (patrząc na listę adb, są też 32-bitowe wersje biblioteki C ++ lib, ncurses, pthreads i kilka innych rzeczy, których nie wiem).

Szybka wskazówka na temat korzystania z whatprovides:

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

;)


ok, postaram się zainstalować wersje bibliotek i686 wyświetlane przez ldd. Z tego powodu: Nie jestem przekonany, wzywając filepakietową wersję adbwyświetlaczy: 32-bitowy plik ELF 32-bitowy plik LSB, Intel 80386 - nie ma nic wspólnego z emulacją ARM - i / usr / bin / adb (z pakietu fedora na Androida-narzędzia) jest faktycznie dostępny jako 64-bitowy plik ELF 64-bitowy LSB, x86-64 .
maxschlepzig

Jeśli wywołam ldd adt-bundle-linux/sdk/platform-tools/adb, wyświetli się komunikat „nie jest dynamicznym plikiem wykonywalnym”. Jeśli chodzi o ŚCIEŻKĘ - to nie jest problem - pełne określenie ścieżki np. ./adt-bundle-linux/sdk/platform-tools/adbW terminalu nie działa (powoduje to „zsh: brak takiego pliku lub katalogu [..]”).
maxschlepzig

Czy masz już zainstalowany glibc.i686? Tak jak powiedziałem, prawdopodobnie potrzebujesz 32-bitowego programu ładującego, aby ldd działał, i to będzie z pakietem glibc. WRT adb będąc 32-bit Intel łuk, to dlatego, że to system, coś skompilowany dla ARM nie będzie tam pracować. Jednak te same 32-bitowe rzeczy mogłyby zostać skompilowane dla ARM i wyobrażam sobie, że niektóre z nich są używane na urządzeniach z Androidem. Przyznaję, że być może myliłem się co do tego, że jest to konieczność, ale w każdym razie to jest to, co jest dostępne, i nie jest to tak naprawdę kłopotem.
goldilocks,

WRT ścieżkę, być może nie jest to konieczne do zaćmienia i (jak mówisz) możesz otrzymać ten sam błąd w wierszu poleceń, jeśli plik i tak nie może zostać wykonany. Po prostu zainstaluj biblioteki lib itp., A dowiesz się.
goldilocks,

2
Nie ma związku między emulatorem będącym programem 32-bitowym a emulowaną platformą posiadającą 32-bitowy procesor. Emulator Androida jest oparty na Qemu, który może emulować dowolny z armv7 (32-bit), armv8 (64-bit), x86, amd64, mips, mips64 i wiele innych, niezależnie od architektury hosta.
Gilles 'SO - przestań być zły'

8

Musisz zainstalować 32-bitowy glibc:

# yum install glibc.i686

Usuwa to mylący komunikat „nie ma takiego pliku lub katalogu” podczas próby uruchomienia 32-bitowego pliku binarnego. Dzięki temu 64-bitowy system Fedora może wykonywać 32-bitowe pliki binarne.

Usuwa to również mylący komunikat „nie jest dynamicznym plikiem wykonywalnym” lddpodczas wywoływania ldd32-bitowego dynamicznego pliku wykonywalnego.

Teraz musisz zainstalować brakujące biblioteki 32-bitowe, z adt-bundle-linux/sdk/platform-toolsktórymi powiązane są pliki binarne :

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

Otóż ​​to.

tło

Niektóre informacje na temat uzyskiwania powyższych nazw pakietów. Na przykład patrząc na wynik

$ 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)
    [..]

oznacza, że ​​nadal brakuje 2 bibliotek dla adb.

Dla każdego „nie znalezionego” musimy wyszukać nazwę pakietu, np .:

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

Teraz bierzemy nazwę bazową pakietu i dodajemy do niej „.i686”, aby uzyskać wersję 32-bitową.


Ta odpowiedź jest świetna, szczególnie pierwsza część - rzeczywiście instalacja glibc.i686pozwala lddna poprawną pracę z plikami binarnymi i386.
Krystian

2

Możesz zainstalować niezbędny pakiet za pomocą:

sudo yum install redhat-lsb.i686
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.