Bir "yükleyiciye" bağlı bir dosyayı yürütemediğinizde, aldığınız hata, yürütmekte olduğunuz dosya yerine yükleyiciye başvurabilir.
- Dinamik olarak bağlanmış bir yerel çalıştırılabilir dosyasının yükleyicisi, dinamik kitaplıkların yüklenmesinden sorumlu olan sistemin bir parçasıdır. Bu
/lib/ld.so
veya benzeri bir şey /lib/ld-linux.so.2
ve yürütülebilir bir dosya olmalıdır.
- Bir betiğin yükleyicisi, shebang satırında belirtilen programdır, örneğin
/bin/sh
, başlangıçtaki bir komut dosyası için #!/bin/sh
. (Bash ve zsh, bu durumda “komut bulunamadı” yerine “hatalı tercüman” mesajı verir.)
Hata mesajı, yükleyicinin sorun olduğunu göstermemekte yanıltıcıdır. Ne yazık ki, bunu düzeltmek zor olacaktır, çünkü çekirdek arayüzü yalnızca sayısal bir hata kodu rapor etmek için yeterli alana sahiptir, aynı zamanda hatanın aslında farklı bir dosyayla ilgili olduğunu göstermez. Bazı mermiler, kendileri komut dosyaları için çalışırlar ( #!
komut dosyasındaki satırı okumak ve hata koşulu yeniden çalışmak), ancak hiçbiri yerel ikili dosyalar için aynı şeyi yapma girişimi görmedim.
ldd
İkili dosyalar üzerinde çalışmayacaktır çünkü bazı özel ortam değişkenlerini ayarlayarak ve daha sonra programı çalıştırarak yükleyicinin çalışmasını sağlayarak çalışır. strace
Çekirdeğin rapor ettiği şeyden daha fazlasını rapor etmeyeceği için anlamlı bir bilgi vermeyecektir. Görüldüğü gibi çekirdeğin bildiği her şeyi rapor edememesidir.
Bu durum genellikle doğru sistem (veya sistem ailesi) ve üst mimarlık için yanlış bir alt mimarlık için bir ikili çalıştırmaya çalıştığınızda ortaya çıkar. Burada ELF ikili dosyalarını bekleyen bir sistemde ELF ikili dosyaları var, bu yüzden çekirdek onları iyi yüklüyor. Bunlar bir x86_64 işlemci üzerinde çalışan i386 binary'leridir, bu nedenle talimatlar mantıklıdır ve programı yükleyicisini arayabileceği noktaya getirir. Ancak program 32 bitlik bir programdır ( file
çıktının belirttiği gibi), 32 bitlik yükleyiciyi arar /lib/ld-linux.so.2
ve muhtemelen yalnızca 64 bitlik yükleyiciyi /lib64/ld-linux-x86-64.so.2
chroot'a yüklediniz .
32 bit çalışma zamanı sistemini chroot: loader ve programların ihtiyaç duyduğu tüm kütüphaneleri kurmanız gerekir. Debian wheezy'den itibaren, hem i386 hem de x86_64 desteğini istiyorsanız, bir amd64 yüklemesiyle başlayın ve çoklu erişim desteğini etkinleştirin : dpkg --add-architecture i386
sonra çalıştırın apt-get update
ve apt-get install libc6:i386 zlib1g:i386 …
(hangi kitaplıkların muhtemel olduğunu görmek için Debian'ın perl paketinin bağımlılıklarının bir listesini oluşturmak istiyorsanız) çalıştırın . ihtiyaç duyulabilir, kullanabilirsiniz aptitude search -F %p '~Rdepends:^perl$ ~ri386'
). ia32-libs
Paketi yükleyerek ortak kütüphaneler koleksiyonundan yararlanabilirsiniz ( önce multiarch desteğini etkinleştirmeniz gerekir). Debian amd64’te wheezy’de, 32-bit yükleyici libc6-i386
paketin içinde. Yükleyerek daha büyük bir 32-bit kitaplık grubunu yükleyebilirsiniz ia32-libs
.
libc6-i386
paket veyaia32-libs
çok fazla kitaplık istiyorsanız).