В настоящее время у меня странная проблема с Debian (wheezy / amd64).
Я создал chroot для установки сервера (я не могу дать более подробную информацию об этом, извините). Давайте назовем его путь /chr_path/
. Чтобы упростить задачу, я инициализировал этот chroot с помощью debootstrap (также wheezy / amd64).
Казалось, что все хорошо работает внутри chroot, но когда я запустил установочный скрипт моего сервера, я получил:
zsh: Not found /some_path/perl
(установщик включает бинарный файл perl по некоторым причинам)
Естественно, я проверил /some_path/
местоположение и нашел бинарный файл "perl". file
в среде chroot возвращает:
/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
Файл существует, кажется, в порядке, имеет правильные права. Я могу использовать file
, ls
, vim
на нем , но как только я пытаюсь выполнить его - ./perl
к примеру - я получаю: zsh: Not found ./perl
.
Эта ситуация вполне понятна для меня. Кроме того :
- Я могу выполнить другие основные двоичные файлы (/ bin / ls, ...) в chroot без получения ошибок
- У меня те же проблемы для других двоичных файлов, которые пришли с проектом
- Когда я пытаюсь выполнить двоичный файл из основного root (
/chr_path/some_path/perl
), он работает. - Я попытался поставить один из двоичных файлов с копией моей
ls
. Я проверил, что права доступа были одинаковыми, но это ничего не изменило (одно работало, а другое нет)
источник
libc6-i386
пакета илиia32-libs
если вам нужно много библиотек).Ответы:
Если вам не удается выполнить файл, который зависит от «загрузчика», полученная ошибка может относиться к загрузчику, а не к исполняемому файлу.
/lib/ld.so
или/lib/ld-linux.so.2
, и должно быть исполняемым файлом./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
thenapt-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
.источник
ldd
но я все еще получаю ту же ошибку.lsb-core
но это не помогло. Я думаю, мне лучше открыть новый вопрос для этого.Запустите
ldd(1)
вашperl
бинарный файл. Часто кажущаяся сбивающей с толкуNot found
ошибка в файле, которая явно существует, потому что одна из общих библиотек, используемых программой, не найдена.Таким образом, возможно, что ваш chroot неполон в отношении разделяемых библиотек, необходимых вашим двоичным файлам.
источник
perl is not a dynamic executable
когда я в chroot, и я получаю правильный список зависимостей извне. В настоящее время я проверяю, есть ли что-то странное, но я использовал debootstrap, чтобы избежать такого недостатка, и у меня уже есть много библиотек (есть исполняемый файл perl в системе chroot, который работает хорошо, но это другая версия; возможно, я просто сделаю несколько символическая ссылка?)