Якщо не вдалося виконати файл, який залежить від "завантажувача", помилка, що ви отримаєте, може стосуватися завантажувача, а не файлу, який ви виконуєте.
- Навантажувач динамічно пов'язаного нативного виконуваного файлу - це частина системи, яка відповідає за завантаження динамічних бібліотек. Це щось на зразок
/lib/ld.so
або /lib/ld-linux.so.2
і має бути виконуваним файлом.
- Завантажувач сценарію - це програма, згадана у рядку shebang, наприклад,
/bin/sh
для сценарію, який починається з #!/bin/sh
. (Bash і zsh дають повідомлення "поганий інтерпретатор" замість "команда не знайдена" в цьому випадку.)
Повідомлення про помилку є досить оманливим, не вказуючи на те, що проблема завантажувача. На жаль, виправити це було б важко, оскільки в інтерфейсі ядра є лише місце для повідомлення про числовий код помилки, а не для вказівки, що помилка насправді стосується іншого файлу. Деякі оболонки виконують роботу самостійно за сценаріями (читаючи #!
рядок у сценарії та переробляючи умову помилки), але жодна, що я бачила, не намагалася зробити те ж саме для нативних бінарних файлів.
ldd
не працюватиме на бінарних файлах, оскільки це працює, встановивши деякі спеціальні змінні середовища, а потім запустивши програму, дозволяючи завантажувачу виконувати роботу. strace
також не надасть жодної змістовної інформації, оскільки вона не повідомила б більше, ніж те, про що повідомляє ядро, і, як ми бачили, ядро не може повідомити про все, що знає.
Така ситуація часто виникає при спробі запустити бінарний файл для потрібної системи (або сімейства систем) та суперархітектури, але неправильної субархітектури. Тут у вас є бінарні файли ELF в системі, яка очікує бінарних файлів ELF, тому ядро завантажує їх просто чудово. Це бінарні файли i386, що працюють на процесорі x86_64, тому вказівки мають сенс і довести програму до того місця, де вона може шукати свій завантажувач. Але програма - це 32-розрядна програма (як file
показує вихід), шукає 32-розрядний завантажувач /lib/ld-linux.so.2
, і ви, мабуть, встановили лише 64-розрядний завантажувач /lib64/ld-linux-x86-64.so.2
у chroot.
Вам потрібно встановити 32-бітну систему виконання в chroot: завантажувач та всі бібліотеки, які програми потребують. Від Debian wheezy і далі, якщо ви хочете підтримувати i386 і x86_64, починайте з установки amd64 і активуйте підтримку мультиарха : запустіть dpkg --add-architecture i386
тоді apt-get update
і apt-get install libc6:i386 zlib1g:i386 …
(якщо ви хочете сформувати список залежностей пакета Perl Debian, щоб побачити, які бібліотеки, ймовірно, будуть потрібні, можна використовувати aptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Ви можете зібрати колекцію загальних бібліотек, встановивши ia32-libs
пакет (спочатку потрібно включити підтримку багатоархів). На Debian amd64 до wheezy 32-розрядний завантажувач є в libc6-i386
комплекті. Ви можете встановити більший набір 32-бітних бібліотек, встановивши ia32-libs
.
libc6-i386
пакет абоia32-libs
якщо ви хочете багато бібліотек).