GNU/Linux >> Znalost Linux >  >> Linux

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

Všechny linuxové porty (tj. linuxové jádro na různých procesorech) používají ELF jako formát souboru pro spustitelné soubory a knihovny. Konkrétní binární soubor ELF je označen jedinou architekturou/OS, na kterém může běžet (ačkoli některé OS mají kompatibilitu pro spouštění binárních souborů ELF z jiných OS).

Většina portů podporuje starší formát a.out. (Některé procesory jsou natolik nové, že pro ně nikdy neexistovaly žádné spustitelné soubory a.out.)

Některé porty podporují i ​​jiné formáty spustitelných souborů; například port PA-RISC má podporu pro staré spustitelné soubory SOM HP-UX a porty μcLinux (nonmmu) podporují svůj vlastní formát FLAT.

Linux má také binfmt_misc , který umožňuje uživatelskému prostoru zaregistrovat obslužné programy pro libovolné binární formáty. Některé distribuce toho využívají k tomu, aby mohly spouštět aplikace Windows, .NET nebo Java – ve skutečnosti stále spouští interpret, ale pro uživatele je zcela transparentní.

Linux na Alpha má podporu pro načítání binárních souborů Intel, které se spouštějí pomocí em86 emulátor.

Je možné zaregistrovat binfmt_misc pro spustitelné soubory jiných architektur, které se mají spouštět pomocí qemu-user.

Teoreticky by bylo možné vytvořit nový formát - možná zaregistrovat novou "architekturu" v ELF - pro tlusté binární soubory. Pak jádro binfmt loader by se musel naučit o tomto novém formátu a nechtěli byste minout ld-linux.so dynamický linker a celý build toolchain. O takovou funkci byl malý zájem, a pokud vím, nikdo na ničem podobném nepracuje.


Všechny distribuce Linuxu používají stejný binární formát ELF, ale stále existují určité rozdíly:

  1. různý procesorový oblouk používá jinou sadu instrukcí.
  2. stejný procesor CPU může používat různé ABI, ABI definuje, jak používat soubor registru, jak volat/vracet rutinu. Různé ABI nemohou spolupracovat.
  3. I na stejném oblouku, stejném ABI to stále neznamená, že můžeme zkopírovat jeden binární soubor v distribuci do jiného. Protože většina binárních souborů není staticky propojena, závisí na knihovnách v rámci distribuce, což znamená, že různé distribuce mohou používat různé verze nebo různé konfigurace kompilace knihoven.

Pokud tedy chcete, aby váš program běžel na všech distribucích, možná budete muset staticky propojit verzi, která závisí pouze na systémovém volání jádra, i když můžete spustit pouze určený oblouk.

Pokud opravdu chcete spustit program na libovolném oblouku, musíte zkompilovat binární soubory pro všechny oblouky a pomocí shellového skriptu spustit ten správný.


Téměř všechny soubory linuxových programů používají standard ELF.


Linux
  1. Rozdíl mezi programem spouštění systému a terminálu?

  2. Rozdíl mezi /opt a /usr/local?

  3. Rozdíl mezi ~/.profile, ~/.bashrc, ~/.bash_profile, ~/.gnomerc, /etc/bash_bashrc, /etc/screenrc …?

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

  2. Existuje rozdíl mezi negací před/po testovacím příkazu?

  3. Existuje nějaká metoda pro spuštění perf pod WSL?

  1. Existuje nějaký ekvivalent vína pro spouštění aplikací pro Mac?

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

  3. Je rozdíl mezi démonem a službou?