Если вам не удается выполнить файл, который зависит от «загрузчика», полученная ошибка может относиться к загрузчику, а не к исполняемому файлу.
- Загрузчик динамически связанного собственного исполняемого файла является частью системы, которая отвечает за загрузку динамических библиотек. Это что-то вроде
/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 и активируйте поддержку multiarch : запустите dpkg --add-architecture i386
then apt-get update
и apt-get install libc6:i386 zlib1g:i386 …
(если вы хотите сгенерировать список зависимостей пакета perl Debian, чтобы увидеть, какие библиотеки могут нужно, можно использовать aptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Вы можете получить коллекцию общих библиотек, установив ia32-libs
пакет (сначала необходимо включить поддержку multiarch). На Debian amd64 вплоть до wheezy 32-битный загрузчик находится в libc6-i386
пакете. Вы можете установить больший набор 32-битных библиотек, установив ia32-libs
.
libc6-i386
пакета илиia32-libs
если вам нужно много библиотек).