it-swarm-tr.com

64 bit sistemde 32 bit ikili dosya çalıştırılırken "Bulunamadı" iletisi alınıyor

Şu anda debian'da garip bir sorunum var (wheezy/AMD64).

Bir sunucu yüklemek için bir chroot oluşturduk (bu konuda daha fazla ayrıntı veremiyorum, üzgünüm). Hadi yolunu diyelim /chr_path/. İşleri kolaylaştırmak için, bu krootu bir debootstrap (ayrıca wheezy/AMD64) ile başlattım.

Hepsi chroot içinde iyi çalışıyor gibiydi, ancak sunucumun yükleyici komut dosyasını başlattığımda: zsh: Not found /some_path/Perl (yükleyici bazı nedenlerle bir Perl ikili dosyası içerir)

Doğal olarak, /some_path/ konum ve ben "Perl" ikili bulundu. chroot ortamında file şunu döndürür:

/some_path/Perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

Dosya var, tamam görünüyor, doğru haklara sahip. Üzerinde file, ls, vim kullanabilirim ama çalıştırmayı denediğimde - ./Perl örneğin - Anladım: zsh: Not found ./Perl.

Bu durum benim için oldukça anlaşılabilir. Dahası :

  • Hata yapmadan diğer temel ikili dosyaları (/ bin/ls, ...) yürütebilirim
  • Projeyle birlikte gelen diğer ikili dosyalar için aynı sorunları yaşıyorum
  • Ana kökten ikili dosyayı yürütmeye çalıştığımda (/chr_path/some_path/Perl), işe yarıyor.
  • Benim ls bir kopyasını ile ikili dosyalardan birini koymaya çalıştım. Erişim haklarının aynı olduğunu kontrol ettim ama bu hiçbir şeyi değiştirmedi (biri çalışıyordu, diğeri değildi)
72
Elenaher

“Yükleyiciye” bağlı bir dosyayı yürütemediğinizde, aldığınız hata yürüttüğünüz dosya yerine yükleyiciye başvurabilir.

  • Dinamik olarak bağlı bir yerel yürütülebilir dosyanın yükleyicisi, sistemin dinamik kitaplıkların yüklenmesinden sorumlu parçasıdır. /lib/ld.so Veya /lib/ld-linux.so.2 Gibi bir şeydir ve yürütülebilir bir dosya olmalıdır.
  • Bir komut dosyasının yükleyicisi, Shebang satırında belirtilen programdır, ör. /bin/sh İle başlayan bir komut dosyası için #!/bin/sh. (Bash ve zsh, bu durumda “komut bulunamadı” yerine “kötü yorumlayıcı” mesajı verir.)

Hata mesajı, yükleyicinin problem olduğunu göstermemekte oldukça yanıltıcıdır. Ne yazık ki, çekirdek arabiriminin yalnızca sayısal bir hata kodunu bildirmek için yeterli yeri olduğu için bunu düzeltmek zor olurdu, ayrıca hatanın aslında farklı bir dosyayla ilgili olduğunu belirtmek için değil. Bazı kabuklar işi komut dosyaları için yapar (komut dosyasındaki #! Satırını okuyarak ve hata koşullarını yeniden çalışır), ancak gördüğüm hiçbiri yerel ikili dosyalar için aynı şeyi yapmaya çalışmadı.

ldd bazı özel ortam değişkenlerini ayarlayıp programı çalıştırarak ve yükleyicinin işi yapmasına izin vererek çalıştığı için ikili dosyalar üzerinde çalışmaz. strace herhangi bir anlamlı bilgi vermez, çünkü çekirdek rapor ettiklerinden daha fazlasını rapor etmez ve gördüğümüz gibi çekirdek bildiği her şeyi rapor edemez.

Bu durum genellikle doğru sistem (veya sistem ailesi) ve üst yapı için bir ikili çalıştırmaya çalıştığınızda, ancak yanlış alt mimari için ortaya çıkar. Burada ELF ikili dosyalarını bekleyen bir sistemde ELF ikili dosyaları var, böylece çekirdek onları iyi yüklüyor. Bunlar bir x86_64 işlemci üzerinde çalışan i386 ikili dosyalarıdır, bu nedenle talimatlar mantıklıdır ve programı yükleyicisini arayabileceği noktaya getirir. Ancak program 32 bitlik bir programdır (file çıktısının gösterdiği gibi), 32 bitlik yükleyiciyi /lib/ld-linux.so.2 Arar ve muhtemelen yalnızca 64 bitlik yükleyiciyi /lib64/ld-linux-x86-64.so.2.

32 bit çalışma zamanı sistemini chroot'a yüklemeniz gerekir: yükleyici ve programların ihtiyaç duyduğu tüm kütüphaneler. Debian wheezy'dan itibaren, hem i386 hem de x86_64 desteği istiyorsanız, bir AMD64 kurulumuyla başlayın ve multiarch desteğini etkinleştirin: dpkg --add-architecture i386 Ve ardından apt-get update Ve apt-get install libc6:i386 zlib1g:i386 … (Debian'ın Perl paketinin bağımlılıklarının bir listesini oluşturmak istiyorsanız, hangi kitaplıklara ihtiyaç duyulduğunu görmek için aptitude search -F %p '~Rdepends:^Perl$ ~ri386' kullanabilirsiniz). ia32-libs paketini yükleyerek ortak kütüphaneler koleksiyonunu çekebilirsiniz (önce çoklu arşiv desteğini etkinleştirmeniz gerekir). Debian AMD64'te hışıltıya kadar, 32 bit yükleyici libc6-i386 paketindedir. ia32-libs yükleyerek daha büyük bir 32 bit kitaplık seti yükleyebilirsiniz.

Perl ikili dosyasında ldd(1) komutunu çalıştırın. Genellikle kafa karıştırıcı görünen Not found Programda kullanılan paylaşılan kitaplıklardan birinin bulunamaması nedeniyle dosyada açıkça bulunan bir hata var.

Bu nedenle, ikili dosyanızın ihtiyaç duyduğu paylaşılan kitaplıklarla ilgili olarak kökünüzün eksik olması mümkündür.

5
camh