Bagaimana menjalankan program 32 bit pada 64 bit Fedora 17?

10

Meskipun bundel Alat Pengembangan Android (ADT) tersedia sebagai paket zip untuk 'Linux 64 Bit', ia menyatakan persyaratan berikut :

Distribusi 64-bit harus mampu menjalankan aplikasi 32-bit.

Dan memang, hanya menjalankan paket gerhana pada sistem Fedora 17 64 bit menghasilkan kesalahan, karena tidak dapat 'menemukan' beberapa alat pengembangan, misalnya adbatau aapt:

Kesalahan menjalankan aapt: Tidak dapat menjalankan program "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": error = 2, Tidak ada file atau direktori: error = 2, Tidak ada file atau direktori

'Tidak ada file seperti itu' menyesatkan karena ada di sana (di bawah $ HOME / lokal):

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

Tapi saya tidak bisa menjalankannya di shell:

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

Melihat file tersebut

$ 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

kita melihat bahwa itu adalah biner 32. Dan sepertinya sistem saya (saat ini) tidak mampu menjalankan aplikasi 32-bit.

Bagaimana saya mengubahnya? Bagaimana cara membuat sistem Fedora 64 bit saat ini yang mampu menjalankan aplikasi 32 bit?

(Tentu saja orang juga bisa bertanya mengapa seseorang akhirnya memasukkan binari 32 bit ke dalam paket biner yang disebut 'Linux 64 bit' ...)

maxschlepzig
sumber
Pertanyaan serupa dengan jawaban di AskFedora: ask.fedoraproject.org/question/365/…
gertvdijk
Untuk memahami mengapa Anda menerima pesan ini: Mendapatkan
Gilles 'SO- stop being evil'

Jawaban:

9

Berkenaan dengan gerhana tidak dapat menemukan adb, dll, ini karena tanpa perpustakaan bersama 32-bit yang diperlukan untuk menjalankannya pada sistem, mereka tidak dapat dieksekusi.

Sehubungan dengan perpustakaan 32-bit, situasinya cukup sederhana: Anda hanya perlu menginstal lib 32-bit yang sesuai. Pada instalasi fedora 64-bit 17 yang saya miliki di sini, pustaka 64-bit utama ada di / usr / lib64 dan lib 32-bit opsional ada di / usr / lib. Jadi, jika saya memanggil lddsdk / 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)

Perhatikan ini semua di / lib, yang merupakan symlink ke / usr / lib (bukan / usr / lib64). Lihat:

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

Pustaka C 32-bit standar. Apa yang dapat Anda lakukan adalah pergi melalui alat SDK 32-bit dan periksa untuk melihat apa yang terkait dengan mereka ldd. Saya tidak punya contoh, tetapi jika ada yang hilang lddlaporkan sesuatu seperti:

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

Pertama , thd, agar ldd berfungsi, Anda akan memerlukan loader 32-bit yang datang dengan glibc 32-bit (tanpa ini, ldd akan menyebutnya file yang tidak dapat dieksekusi dan tidak memberi tahu Anda apa pun):

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

Itu terpotong, tetapi paket x86_64 sudah Anda miliki; i686 adalah versi 32-bit. Jadi instal saja.

Anda tidak memerlukan paket 'devel', karena tidak ada yang dikompilasi. Di luar itu, tebakan dan yum whatprovides/ yang yum searchseharusnya membantu (melihat daftar adb, ada juga versi 32-lib dari C ++ lib, ncurses, pthreads, dan beberapa hal yang saya tidak tahu).

Kiat cepat tentang penggunaan whatprovides:

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

;)

goldilocks
sumber
ok, saya akan mencoba menginstal versi perpustakaan i686 yang ditampilkan via ldd. Karena itu: Saya tidak yakin, meminta fileversi bundel adbtampilan: ELF 32-bit LSB dapat dieksekusi, Intel 80386 - tidak ada hubungannya dengan emulasi ARM - dan / usr / bin / adb (dari paket fedora android-tools) sebenarnya tersedia sebagai ELF 64-bit LSB yang dapat dieksekusi, x86-64 .
maxschlepzig
Jika saya memanggil ldd di adt-bundle-linux/sdk/platform-tools/adbatasnya menampilkan 'not a dynamic executable'. Mengenai PATH - ini bukan masalah - sepenuhnya menentukan jalur misalnya ./adt-bundle-linux/sdk/platform-tools/adbdi terminal tidak berfungsi (menghasilkan 'zsh: tidak ada file atau direktori [..]').
maxschlepzig
Apakah Anda sudah menginstal glibc.i686? Seperti yang saya katakan, Anda (kemungkinan) membutuhkan loader 32-bit agar ldd berfungsi, dan itu akan dengan paket glibc. WRT adb menjadi intel arch 32-bit , itu karena itu sistem Anda, sesuatu yang dikompilasi untuk ARM tidak akan berfungsi di sana. Namun, hal 32-bit yang sama dapat dikompilasi untuk ARM, dan saya membayangkan bagian dari itu ketika digunakan pada perangkat Android. Saya akui mungkin salah tentang hal itu yang merupakan kebutuhan, tetapi bagaimanapun, itulah yang tersedia, dan itu tidak terlalu merepotkan.
goldilocks
WRT path, mungkin itu tidak perlu untuk eclipse, dan (seperti yang Anda katakan) Anda mungkin mendapatkan kesalahan yang sama pada baris perintah jika file tetap tidak dapat dieksekusi. Dapatkan saja lib terinstal, dll, dan Anda akan mengetahuinya.
goldilocks
2
Tidak ada hubungan antara emulator menjadi program 32-bit dan platform yang ditiru memiliki prosesor 32-bit. Emulator Android sebenarnya didasarkan pada Qemu, yang dapat meniru setiap armv7 (32-bit), armv8 (64-bit), x86, amd64, mips, mips64, dan banyak lagi, terlepas dari arsitektur host.
Gilles 'SO- stop being evil'
8

Anda harus menginstal 32 bit glibc:

# yum install glibc.i686

Ini menghapus pesan 'no file or directory' yang menyesatkan ketika mencoba menjalankan biner 32 bit. Dengan itu sistem Fedora 64 bit mampu mengeksekusi binari 32 bit.

Ini juga menghilangkan pesan 'bukan eksekusi dinamis' yang menyesatkan lddketika memanggil lddeksekusi dinamis 32 bit.

Sekarang Anda harus menginstal pustaka 32 bit yang hilang yang biner-binari adt-bundle-linux/sdk/platform-toolsditautkan:

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

Itu dia.

Latar Belakang

Beberapa latar belakang cara menurunkan nama paket di atas. Misalnya melihat output dari

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

berarti, bahwa 2 perpustakaan masih hilang untuk adb.

Untuk setiap 'tidak ditemukan' kita harus mencari nama paket, misalnya:

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

Sekarang kita ambil nama dasar paket dan tambahkan '.i686' untuk mendapatkan versi 32 bit.

maxschlepzig
sumber
Jawaban ini sangat bagus, terutama bagian pertama - memang menginstal glibc.i686memungkinkan ldduntuk bekerja dengan baik dengan i386 binari.
Krystian
2

Anda dapat menginstal paket yang diperlukan dengan:

sudo yum install redhat-lsb.i686
xwindows
sumber