it-swarm-eu.dev

Při spuštění 32bitového binárního systému v 64bitovém systému se zobrazuje zpráva „Nenalezeno“

V současné době mám na debianu zvláštní problém (pískot/AMD64).

Vytvořil jsem chroot pro instalaci serveru (nemůžu o tom poskytnout žádné další podrobnosti, omlouvám se). Nazvěme jeho cestu /chr_path/. Abych to usnadnil, inicializoval jsem tento chroot pomocí debootstrapu (také wheezy/AMD64).

Zdálo se, že všichni dobře fungují uvnitř chrootu, ale když jsem spustil instalační skript svého serveru, dostal jsem: zsh: Not found /some_path/Perl (instalátor obsahuje z nějakých důvodů binární Perl)

Přirozeně jsem zkontroloval /some_path/ umístění a našel jsem "Perl" binární. file v chroot prostředí vrátí:

/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

Soubor existuje, zdá se, v pořádku, má správná práva. Mohu na to použít file, ls, vim, ale jakmile se pokusím provést - ./Perl například - dostanu: zsh: Not found ./Perl.

Tato situace je pro mě docela pochopitelná. Navíc :

  • Dokážu v chrootu provádět další základní binární soubory (/ bin/ls, ...) bez toho, abych dostal chyby
  • Mám stejné problémy i pro další binární soubory, které přišly s projektem
  • Když se pokusím spustit binární z hlavního kořenového adresáře (/chr_path/some_path/Perl), funguje to.
  • Pokusil jsem se dát jeden z binárních souborů kopií mého ls. Ověřil jsem, že přístupová práva byla stejná, ale nic to nezměnilo (jedno fungovalo a druhé ne)
72
Elenaher

Pokud se vám nepodaří spustit soubor, který závisí na „zavaděči“, může se chyba, která se zobrazí, vztahovat spíše na zavaděč než na prováděný soubor.

  • Zavaděč dynamicky propojeného nativního spustitelného souboru je součástí systému, který je zodpovědný za načítání dynamických knihoven. Je to něco jako /lib/ld.so nebo /lib/ld-linux.so.2, a měl by to být spustitelný soubor.
  • Zavaděč skriptu je program uvedený na řádku Shebang, např. /bin/sh pro skript, který začíná #!/bin/sh. (Bash a zsh v tomto případě zobrazí zprávu „špatný interpret“ místo „příkaz nenalezen“).

Chybová zpráva je spíše zavádějící v tom, že nenaznačuje, že je problém zavaděč. Opravit by to bohužel bylo obtížné, protože rozhraní jádra má pouze prostor pro hlášení číselného kódu chyby, nikoli pro označení toho, že se chyba ve skutečnosti týká jiného souboru. Některé skořápky pracují sami pro skripty (čtení #! řádek na skriptu a přepracování chybového stavu), ale žádný, o kterém jsem viděl, jak se pokouší udělat to samé pro nativní binární soubory.

ldd nebude fungovat v binárních souborech, protože to funguje nastavením určitých speciálních proměnných prostředí a následným spuštěním programu, což zavaděči umožní práci. strace by také neposkytl žádné smysluplné informace, protože by nehlásil více než to, co jádro hlásí, a jak jsme viděli, jádro nemůže hlásit vše, co ví.

Tato situace často nastane, když se pokusíte spustit binární pro správný systém (nebo rodinu systémů) a superarchitekturu, ale pro nesprávnou subarchitekturu. Zde máte binární soubory ELF v systému, který očekává binární soubory ELF, takže je jádro načítá dobře. Jsou to binární soubory i386, které běží na procesoru x86_64, takže instrukce dávají smysl a dostanou program do bodu, kde může hledat jeho zavaděč. Ale program je 32bitový program (jak ukazuje výstup file), hledá 32bitový zavaděč /lib/ld-linux.so.2 a pravděpodobně jste nainstalovali pouze 64bitový zavaděč /lib64/ld-linux-x86-64.so.2 v chroot.

Je třeba nainstalovat 32bitový runtime systém v chrootu: zavaděč a všechny knihovny, které programy potřebují. Pokud budete chtít podporovat i386 i x86_64, začněte od instalace Debian wheezy a začněte instalací AMD64 a aktivujte multiarch support: run dpkg --add-architecture i386 pak apt-get update a apt-get install libc6:i386 zlib1g:i386 … (Pokud chcete vygenerovat seznam závislostí balíčku Perl Debianu, abyste zjistili, jaké knihovny budou pravděpodobně potřeba, můžete použít aptitude search -F %p '~Rdepends:^Perl$ ~ri386'). Instalací ia32-libs balíček (musíte nejprve povolit podporu více chráničů). Na Debianu AMD64 až do pískání je 32bitový zavaděč v libc6-i386 balíček. Můžete nainstalovat větší sadu 32bitových knihoven instalací ia32-libs .

Spusťte ldd(1) na binárku Perl. Často zdánlivě matoucí Not found chyba v souboru, který je zjevně tam, protože jedna ze sdílených knihoven používaných programem nebyla nalezena.

Je tedy možné, že váš chroot není úplný, pokud jde o sdílené knihovny, které vaše binární soubory potřebují.

5
camh