Quando non si riesce a eseguire un file che dipende da un "caricatore", l'errore che si ottiene può riferirsi al caricatore anziché al file che si sta eseguendo.
- Il caricatore di un eseguibile nativo collegato dinamicamente è la parte del sistema che è responsabile del caricamento delle librerie dinamiche. È qualcosa di simile
/lib/ld.so
o /lib/ld-linux.so.2
e dovrebbe essere un file eseguibile.
- Il caricatore di uno script è il programma menzionato sulla riga shebang, ad esempio
/bin/sh
per uno script che inizia con #!/bin/sh
. (Bash e zsh danno un messaggio "cattivo interprete" invece di "comando non trovato" in questo caso.)
Il messaggio di errore è piuttosto fuorviante nel non indicare che il caricatore è il problema. Sfortunatamente, risolvere questo problema sarebbe difficile perché l'interfaccia del kernel ha spazio solo per segnalare un codice di errore numerico, non per indicare anche che l'errore riguarda effettivamente un file diverso. Alcune shell eseguono il lavoro autonomamente per gli script (leggendo la #!
riga sullo script e rielaborando la condizione di errore), ma nessuno di quelli che ho visto tenta di fare lo stesso per i binari nativi.
ldd
non funzionerà sui binari perché funziona impostando alcune variabili d'ambiente speciali e quindi eseguendo il programma, lasciando che il caricatore faccia il lavoro. strace
non fornirebbe alcuna informazione significativa, dal momento che non riferirebbe più di quello che riporta il kernel, e come abbiamo visto il kernel non può riportare tutto ciò che sa.
Questa situazione si presenta spesso quando si tenta di eseguire un binario per il sistema giusto (o la famiglia di sistemi) e la superarchitettura ma la sottoarchitettura errata. Qui hai binari ELF su un sistema che prevede binari ELF, quindi il kernel li carica bene. Sono binari i386 in esecuzione su un processore x86_64, quindi le istruzioni hanno senso e portano il programma al punto in cui può cercare il suo caricatore. Ma il programma è un programma a 32 bit (come file
indica l' output), cercando il caricatore a 32 bit /lib/ld-linux.so.2
e presumibilmente hai installato solo il caricatore /lib64/ld-linux-x86-64.so.2
a 64 bit nel chroot.
Devi installare il sistema di runtime a 32 bit nel chroot: il caricatore e tutte le librerie di cui i programmi hanno bisogno. Da Debian wheezy in poi, se si desidera sia il supporto i386 che x86_64, iniziare con un'installazione amd64 e attivare il supporto multiarch : eseguire dpkg --add-architecture i386
quindi apt-get update
e apt-get install libc6:i386 zlib1g:i386 …
(se si desidera generare un elenco delle dipendenze del pacchetto perl di Debian, per vedere quali librerie sono probabili essere necessario, è possibile utilizzare aptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Puoi inserire una raccolta di librerie comuni installando il ia32-libs
pacchetto (devi prima abilitare il supporto multiarch). Su Debian amd64 fino a wheezy, il caricatore a 32 bit è nel libc6-i386
pacchetto. È possibile installare un set più grande di librerie a 32 bit installando ia32-libs
.
libc6-i386
pacchetto oia32-libs
se vuoi molte librerie).