GNU/Linux >> Znalost Linux >  >> Linux

Zobrazuje se zpráva „nenalezeno“ při spuštění 32bitové binární verze na 64bitovém systému?

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

Vytvořil jsem chroot pro instalaci serveru (nemohu o něm poskytnout žádné podrobnosti, omlouvám se). Nazvěme jeho cestu /chr_path/ .
Abychom to usnadnili, inicializoval jsem tento chroot pomocí debootstrapu (také wheezy/amd64).

Zdálo se, že vše funguje dobře uvnitř chrootu, ale když jsem spustil instalační skript mého serveru, dostal jsem:
zsh:Nenalezeno /some_path/perl (instalační program obsahuje z nějakých důvodů binární soubor Perl)

Samozřejmě jsem zkontroloval /some_path/ umístění a našel jsem binární soubor „perl“. soubor v chrootovém prostředí vrací :

/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 být v pořádku, má správná práva. Mohu použít soubor , ls , vim na něm, ale jakmile se jej pokusím spustit – ./perl například – dostanu :zsh:Not found ./perl .

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

  • Mohu spouštět další základní binární soubory (/bin/ls,…) v chrootu bez chyb
  • Mám stejné problémy s ostatními binárními soubory, které byly dodány s projektem
  • Když se pokusím spustit binární soubor z hlavního kořenového adresáře (/chr_path/some_path/perl ), funguje to.
  • Snažil jsem se vložit jeden z binárních souborů s kopií mého ls . Zkontroloval jsem, že přístupová práva jsou stejná, ale nic se nezměnilo (jedno fungovalo a druhé ne)

Přijatá odpověď:

Když se vám nepodaří spustit soubor, který závisí na „zavaděči“, chyba se může týkat zavaděče, nikoli souboru, který spouštíte.

  • 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ěčem skriptu je program uvedený na řádku shebang, např. /bin/sh pro skript, který začíná #!/bin/sh . (Bash a zsh dávají v tomto případě zprávu „špatný interpret“ místo „příkaz nenalezen“.)

Chybová zpráva je spíše zavádějící, protože neoznačuje, že problém je v zavaděči. Bohužel by to bylo těžké, protože rozhraní jádra má prostor pouze pro hlášení číselného kódu chyby, nikoli pro indikaci toho, že se chyba ve skutečnosti týká jiného souboru. Některé shelly dělají práci se skripty samy (čtou #! řádek ve skriptu a přepracování chybového stavu), ale žádný, který jsem neviděl, se pokoušel udělat totéž pro nativní binární soubory.

ldd nebude fungovat ani na binárních souborech, protože funguje tak, že nastaví některé speciální proměnné prostředí a poté spustí program, přičemž práci nechá zavaděč. strace by také neposkytlo žádné smysluplné informace, protože by nehlásilo více, než hlásí jádro, a jak jsme viděli, jádro nemůže hlásit vše, co ví.

Související:Jak určit optimální hodnotu pro parametr bs na dd?

Tato situace často nastává, když se pokoušíte spustit binární soubor pro správný systém (nebo rodinu systémů) a superarchitekturu, ale špatnou podarchitekturu. Zde máte binární soubory ELF v systému, který očekává binární soubory ELF, takže je jádro načte v pořádku. Jsou to binárky i386 běžící na procesoru x86_64, takže instrukce dávají smysl a dostanou program do bodu, kdy může hledat svůj zavaděč. Ale program je 32bitový program (jako soubor výstup indikuje), hledá 32bitový zavaděč /lib/ld-linux.so.2 a pravděpodobně jste nainstalovali pouze 64bitový zavaděč /lib64/ld-linux-x86-64.so.2 v chrootu.

Musíte nainstalovat 32bitový runtime systém do chrootu:zavaděč a všechny knihovny, které programy potřebují. Od Debian wheezy dále, pokud chcete podporu i386 a x86_64, začněte s instalací amd64 a aktivujte podporu multiarch:spusťte dpkg --add-architecture i386 poté apt-get update a apt-get install libc6:i386 zlib1g:i386 … (chcete-li vygenerovat seznam závislostí balíčku Perl Debianu, abyste viděli, jaké knihovny budou pravděpodobně potřeba, můžete použít aptitude search -F %p '~Rdepends:^perl$ ~ri386' ). Kolekci běžných knihoven můžete stáhnout instalací ia32-libs balíček (nejprve musíte povolit podporu multiarch). Na Debianu amd64 až po wheezy je 32bitový zavaděč v libc6-i386 balík. Větší sadu 32bitových knihoven můžete nainstalovat instalací ia32-libs .


Linux
  1. Jak zachovat vlastnictví a oprávnění k souborům při kopírování souborů nebo adresářů

  2. Jsou nástroje Linuxu chytré při spouštění příkazů Piped?

  3. Rozbalením souboru .gz získáte textový soubor, ale získáte binární soubor?

  1. Nelze smazat soubor, i když běží jako root?

  2. Spouštíte 32bitovou aplikaci pod 64bitovým Linuxem?

  3. Žádná taková chyba souboru nebo adresáře při spouštění binárního souboru

  1. Jak se vyhnout varovné zprávě „jsou stejný soubor“ při použití cp v Linuxu?

  2. Proč se mi při spuštění ssh-add odepírá oprávnění?

  3. Jak zjistit, zda je linuxový binární soubor 32bitový nebo 64bitový?