64 bit Fedora 17'de 32 bit programlar nasıl çalıştırılır?


10

Android Geliştirme Araçları (ADT) paketi 'Linux 64 Bit' için bir zip paketi olarak mevcut olmasına rağmen, aşağıdaki gereksinimleri belirtir :

64 bit dağıtımlar 32 bit uygulamaları çalıştırabilmelidir.

O 'Bul' birkaç geliştirme araçları, örneğin olamaz çünkü Gerçekten de sadece hatalarda Fedora 17 64 bit sistem sonuçlarına paketlenmiş tutulması çalışan adbveya aapt:

Aapt yürütme hatası: "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt" programı çalıştırılamıyor: hata = 2, Böyle bir dosya veya dizin yok: hata = 2, Böyle bir dosya veya dizin yok

'Böyle bir dosya yok' var olduğu için yanıltıcı ($ HOME / local altında):

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

Ama onu kabuğa koyamıyorum:

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

Dosyaya bakma

$ 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

32 ikili olduğunu görüyoruz. Ve sistemimin (şu anda) 32 bit uygulamaları çalıştıramayacağı anlaşılıyor.

Bunu nasıl değiştirebilirim? Mevcut bir Fedora 64 bit sistemini 32 bit uygulamaları çalıştırabilecek hale nasıl getirebilirim?

(Tabii ki birisi neden 32 bit ikili dosyaları 'Linux 64 bit' adlı bir ikili pakete koyduğunu da sorabilir.)


AskFedora cevabı ile benzer soru: ask.fedoraproject.org/question/365/…
gertvdijk

Yanıtlar:


9

Tutulmanın bulamaması adbvb. İle ilgili olarak , bu, 32 bit paylaşılan kütüphanelerin sistemde çalıştırılması gerekmediği için çalıştırılabilir değildir.

32 bit kitaplıklar ile ilgili olarak, durum oldukça basittir: sadece uygun 32 bit kütüphaneleri kurmanız gerekir. Burada sahip olduğum 64-bit fedora 17 kurulumunda, birincil 64-bit kütüphaneler / usr / lib64 ve isteğe bağlı 32-bit kütüphaneler / usr / lib içindedir. Yani, lddsdk / platform-tools / adb'yi çağırırsam :

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)

Bunların hepsinin, / usr / lib (/ usr / lib64 değil) için bir sembolik bağlantı olan / lib'de olduğuna dikkat edin. Bak:

»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 bit standart C kitaplığı. Yapabileceğiniz şey, 32 bit sdk araçlarından geçmek ve neyle bağlantılı olduklarını kontrol etmektir ldd. Elimde bir örnek yok, ama bir şey eksikse lddşöyle bir şey bildirir:

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

İlk olarak , ldd'nin çalışması için 32-bit glibc ile birlikte gelen 32-bit yükleyiciye ihtiyacınız olacak (bu olmadan ldd, yürütülebilir olmayan bir dosya olarak adlandırır ve size hiçbir şey söylemez):

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

Bu kesilmiş, ancak x86_64 paketi zaten sahip olduğunuz şeydir; i686 32 bit sürümüdür. Sadece yükleyin.

Hiçbir şey derlenmediği için 'devel' paketlerine ihtiyacınız yoktur. Bunun ötesinde, eğitimli tahminler ve yum whatprovides/ yum searchyardımcı olmalıdır (adb listesine bakarak, C ++ lib'in 32 bit sürümleri, ncurses, pthreads ve bilmediğim birkaç şey var).

Kullanımı hakkında hızlı ipucu whatprovides:

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

;)


tamam, üzerinden görüntülenen kitaplıkların i686 sürümlerini yüklemeye çalışacağım ldd. Nedeni: Ekranların filepaket sürümünü çağırarak ikna olmadım adb: ELF 32 bit LSB yürütülebilir, Intel 80386 - ARM emülasyonu ile ilgisi yok - ve / usr / bin / adb (android-tools fedora paketinden) aslında ELF 64 bit LSB çalıştırılabilir x86-64 olarak kullanılabilir .
maxschlepzig

Eğer ldd'yi çağırırsam adt-bundle-linux/sdk/platform-tools/adb, 'dinamik yürütülebilir değil' görüntüler. PATH ile ilgili olarak - bu bir sorun değildir - örneğin ./adt-bundle-linux/sdk/platform-tools/adbbir terminalde yolun tam olarak belirtilmesi işe yaramaz ('zsh: böyle bir dosya veya dizin [..]' ile sonuçlanmaz).
maxschlepzig

Henüz glibc.i686 kurulu değil mi? Dediğim gibi, ldd'nin çalışması için (muhtemelen) 32 bit yükleyiciye ihtiyacınız var ve bu glibc paketi ile olacak. WRT adb 32 bitlik bir intel arch, çünkü bu sizin sisteminiz, ARM için derlenmiş bir şey orada çalışmayacak. Ancak, aynı 32 bit şeyler olabilir Android cihazlarda kullanıldığında bunun ARM için derlenmiş ve hayal edilebilir parçalarıdır. İhtiyaç olması konusunda yanlış olabileceğini itiraf ediyorum, ancak her durumda, mevcut olan budur ve bu gerçekten de bir güçlük değildir.
goldilocks

WRT yolu, belki eclipse için gerekli değildir ve (yine de söylediğiniz gibi) dosya yine de yürütülemezse komut satırında aynı hatayı alabilirsiniz. Sadece libs yüklü olsun, ve öğreneceksiniz.
goldilocks

2
Emülatörün 32 bit bir program olması ile 32 bit işlemciye sahip taklit platform arasında bir ilişki yoktur. Android emülatörü, ana bilgisayar mimarisinden bağımsız olarak armv7 (32 bit), armv8 (64 bit), x86, amd64, mips, mips64 ve daha fazlasını taklit edebilen Qemu'ya dayanıyor.
Gilles 'SO- kötü olmayı kes

8

32 bit glibc'yi yüklemelisiniz:

# yum install glibc.i686

Bu, 32 bit ikilik yürütmeye çalışırken yanıltıcı 'böyle bir dosya veya dizin yok' iletisini kaldırır. Bununla birlikte 64 bit Fedora sistemi 32 bit ikili dosyaları yürütebilir.

Bu aynı zamanda 32 bit dinamik yürütülebilir dosya lddçağrıldığında yanıltıcı 'dinamik yürütülebilir değil' iletisini de kaldırır ldd.

Şimdi altında ikili adt-bundle-linux/sdk/platform-toolsbağlı olan 32 bit eksik kütüphaneler yüklemeniz gerekir :

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

Bu kadar.

Arka fon

Bazı paketlerin yukarıdaki paket adlarının nasıl türetileceği. Örneğin;

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

yani 2 kitaplık adb için hala eksiktir.

Her bir 'bulunamadı' için paket adını aramalıyız, örneğin:

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

Şimdi paket taban adını alıyoruz ve 32 bit sürümünü almak için '.i686' ekliyoruz.


Bu cevap harika, özellikle ilk bölüm - gerçekten kurulum i386 ikili dosyaları ile düzgün çalışmayı glibc.i686sağlar ldd.
Krystian

2

Gerekli paketi aşağıdakilerle kurabilirsiniz:

sudo yum install redhat-lsb.i686
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.