GNU/Linux >> Znalost Linux >  >> Linux

Linux – Poběží spustitelný soubor Linuxu zkompilovaný na jedné „příchuti“ Linuxu na jiné?

Bude spustitelný soubor malého, extrémně jednoduchého programu, jako je ten zobrazený níže, který je zkompilován na jedné variantě Linuxu, spuštěn na jiné variantě? Nebo by bylo nutné jej překompilovat?

Záleží na architektuře stroje v případě, jako je tento?

int main()
{
  return (99);
}

Přijatá odpověď:

Záleží. Něco kompilovaného pro IA-32 (Intel 32-bit) může běžet na amd64, protože Linux na Intelu si zachovává zpětnou kompatibilitu s 32bitovými aplikacemi (s nainstalovaným vhodným softwarem). Zde je váš code zkompilován na RedHat 7.3 32bitovém systému (cca 2002, gcc verze 2.96) a poté binární soubor zkopírován a spuštěn na 64bitovém systému Centos 7.4 (cca 2017):

-bash-4.2$ file code
code: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
-bash-4.2$ ./code
-bash: ./code: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
-bash-4.2$ sudo yum -y install glibc.i686
...
-bash-4.2$ ./code ; echo $?
99

Starověký RedHat 7.3 až Centos 7.4 (v podstatě RedHat Enterprise Linux 7.4) zůstává ve stejné „distribuční“ rodině, takže bude pravděpodobně mít lepší přenositelnost než přechod z nějaké náhodné instalace „Linux od nuly“ z roku 2002 do nějaké jiné náhodné distribuce Linuxu v roce 2018. .

Něco zkompilovaného pro amd64 by nefungovalo na 32bitových verzích Linuxu (starý hardware neví o novém). To platí také pro nový software kompilovaný na moderních systémech, které mají být provozovány na starých starých věcech, protože knihovny a dokonce i systémová volání nemusí být zpětně přenosná, takže mohou vyžadovat kompilační triky nebo získání starého kompilátoru a tak dále, případně místo toho. kompilace na starém systému. (To je dobrý důvod, proč si ponechat virtuální stroje starých věcí.)

Na architektuře záleží; amd64 (nebo IA-32) se výrazně liší od ARM nebo MIPS, takže se neočekává, že by binární systém jednoho z nich běžel na jiném. Na úrovni sestavení main část vašeho kódu na IA-32 se zkompiluje pomocí gcc -S code.c do

main:
    pushl %ebp
    movl %esp,%ebp
    movl $99,%eax
    popl %ebp
    ret

se kterými si systém amd64 poradí (na systému Linux – OpenBSD na rozdíl od amd64 ne podpora 32bitových binárních souborů; zpětná kompatibilita se starými oblouky dává útočníkům prostor pro pohyb, např. CVE-2014-8866 a přátelé). Mezitím na big-endian MIPS systému main místo toho se zkompiluje do:

main:
        .frame  $fp,8,$31
        .mask   0x40000000,-4
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro
        addiu   $sp,$sp,-8
        sw      $fp,4($sp)
        move    $fp,$sp
        li      $2,99
        move    $sp,$fp
        lw      $fp,4($sp)
        addiu   $sp,$sp,8
        j       $31
        nop

se kterým procesor Intel nebude mít ponětí, co má dělat, a stejně tak pro sestavu Intel na MIPS.

Ke spouštění cizího kódu byste možná mohli použít QEMU nebo nějaký jiný emulátor (možná velmi, velmi pomalu).

Nicméně! Váš kód je velmi jednoduchý kód, takže bude mít méně problémů s přenositelností než cokoli jiného; programy obvykle využívají knihovny, které se v průběhu času měnily (glibc, openssl, …); pro ty může být také nutné nainstalovat starší verze různých knihoven (například RedHat pro takové typy obvykle uvádí „compat“ někde v názvu balíčku)

compat-glibc.x86_64                     1:2.12-4.el7.centos

nebo se možná starejte o změny ABI (Application Binary Interface) pro staré věci, které používají glibc, nebo novější změny kvůli C++ 11 nebo jiným vydáním C++. Dalo by se také kompilovat statické (výrazně zvětšit binární velikost na disku), aby se zabránilo problémům s knihovnami, i když to, zda to dělala nějaká stará binární verze, závisí na tom, zda stará distribuce Linuxu kompilovala většinu všeho dynamického (RedHat:ano), nebo ne. Na druhou stranu věci jako patchelf může znovu nastavit dynamické (ELF, ale pravděpodobně ne a.out format) binární soubory k použití jiných knihoven.

Související:Linux – Nepodařilo se nainstalovat perf na slackware 13.1?

Nicméně! Umět spouštět program je jedna věc a druhá věc je skutečně s ním dělat něco užitečného. Staré 32bitové binární soubory Intel mohou mít bezpečnostní problémy, pokud jsou závislé na verzi OpenSSL, která má v sobě nějaký hrozný a neportovaný bezpečnostní problém, nebo program nemusí být schopen vyjednávat vůbec s moderními webovými servery (jako moderní servery odmítají staré protokoly a šifry starého programu), nebo protokol SSH verze 1 již není podporován, nebo …


Linux
  1. Jednoduchý příkaz pro Linux, který mi řekne, co je Správce zobrazení?

  2. Linux – Jsou různá jádra Linux/unix zaměnitelná?

  3. Nejlepší postup pro spuštění služby Linux jako jiný uživatel

  1. Existuje nějaký rozdíl mezi spustitelnými binárními soubory mezi distribucemi?

  2. Vložení ikony do spustitelného souboru Linux

  3. Pro jeden příkaz použijte jinou verzi PHP spustitelný CLI

  1. Linux – Spouštět aplikace Mac OS X na Linuxu?

  2. Jak mohu bezpečně spustit nedůvěryhodný spustitelný soubor na linuxu?

  3. Může jeden z uzlů clusteru s podporou převzetí služeb při selhání běžet na Linuxu?