Jeśli nie uda się uruchomić pliku zależnego od „modułu ładującego”, wyświetlony błąd może dotyczyć modułu ładującego, a nie wykonywanego pliku.
- Moduł ładujący dynamicznie połączonego natywnego pliku wykonywalnego jest częścią systemu odpowiedzialną za ładowanie bibliotek dynamicznych. Jest to coś w rodzaju
/lib/ld.so
lub /lib/ld-linux.so.2
i powinno być plikiem wykonywalnym.
- Program ładujący skrypt to program wymieniony w wierszu shebang, np.
/bin/sh
Dla skryptu, który zaczyna się od #!/bin/sh
. (Bash i zsh podają komunikat „zły tłumacz” zamiast „polecenia nie znaleziono” w tym przypadku.)
Komunikat o błędzie jest raczej mylący, ponieważ nie oznacza, że problem stanowi moduł ładujący. Niestety, naprawienie tego byłoby trudne, ponieważ interfejs jądra ma miejsce tylko na zgłoszenie liczbowego kodu błędu, a nie na wskazanie, że błąd w rzeczywistości dotyczy innego pliku. Niektóre powłoki wykonują same prace dla skryptów (odczytując #!
wiersz skryptu i ponownie sprawdzając warunek błędu), ale żadna z tych, które widziałem, nie próbuje zrobić tego samego dla natywnych plików binarnych.
ldd
nie będzie działać na plikach binarnych, ponieważ działa poprzez ustawienie specjalnych zmiennych środowiskowych, a następnie uruchomienie programu, umożliwiając programowi ładującemu wykonanie pracy. strace
nie dostarczyłby również żadnych istotnych informacji, ponieważ nie zgłosiłby więcej niż to, co zgłasza jądro, a jak widzieliśmy, jądro nie może zgłaszać wszystkiego, co wie.
Taka sytuacja często pojawia się, gdy próbujesz uruchomić plik binarny dla odpowiedniego systemu (lub rodziny systemów) i superarchitektury, ale niewłaściwej podarchitektury. Tutaj masz pliki binarne ELF w systemie, który oczekuje plików binarnych ELF, więc jądro ładuje je dobrze. Są to pliki binarne i386 działające na procesorze x86_64, więc instrukcje mają sens i doprowadzają program do punktu, w którym może szukać swojego modułu ładującego. Ale program jest programem 32-bitowym (jak file
wskazuje dane wyjściowe), szuka 32-bitowego programu ładującego /lib/ld-linux.so.2
i prawdopodobnie zainstalowałeś tylko 64-bitowy moduł ładujący /lib64/ld-linux-x86-64.so.2
w chroot.
Musisz zainstalować 32-bitowy system wykonawczy w chroot: moduł ładujący i wszystkie biblioteki, których potrzebują programy. Począwszy od wersji Debian wheezy, jeśli chcesz obsługiwać zarówno i386, jak i x86_64, zacznij od instalacji amd64 i aktywuj obsługę wielu ścieżek : uruchom dpkg --add-architecture i386
wtedy apt-get update
i apt-get install libc6:i386 zlib1g:i386 …
(jeśli chcesz wygenerować listę zależności pakietu perla Debiana, aby zobaczyć, jakie biblioteki prawdopodobnie będą być potrzebne, możesz użyć aptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Możesz pobrać kolekcję popularnych bibliotek, instalując ia32-libs
pakiet (najpierw musisz włączyć obsługę wielu kanałów). W systemie Debian amd64 aż do wheezy, 32-bitowy moduł ładujący znajduje się w libc6-i386
pakiecie. Instalując, możesz zainstalować większy zestaw bibliotek 32-bitowych ia32-libs
.
libc6-i386
pakietu lubia32-libs
jeśli chcesz mieć wiele bibliotek).