GNU/Linux >> Znalost Linux >  >> Linux

(C/C++) Jak vygenerovat spustitelný soubor, který lze spustit na Windows i Linuxu?

Neexistuje žádný způsob, jak mít jeden nativní spustitelný soubor zkompilovaný ze zdroje C++, který funguje na různých platformách. Nevěřím vám, že stejný spustitelný soubor běží na Windows a Linuxu, jak uvádíte ve svém druhém odstavci.


Jednoduchá odpověď je, že nemůžete.

Binární spustitelné formáty PE (Windows) a ELF (Linux) jsou zcela odlišné.

Nemluvě o tom, že program C/C++ vyžaduje propojení s knihovnami, které nebudou dostupné na žádné platformě současně.

Můžete však použít Wine na Linuxu ke spuštění spustitelného souboru Windows za předpokladu, že se nepokouší o exotická volání specifická pro Windows.

Nebo se můžete rozhodnout použít "běžnější" multiplatformní jazyk, jako je jazyk CLI (C#/IronPython/Java atd.), který podporuje .NET pro Windows a Mono pro linux/ostatní.


Dobře, děti.

Ano, můžete napsat multiplatformní binární soubor, ale je to obtížné. Říká se tomu Fat Binary a v 80. letech to bývalo dost běžné, i když jsem to neviděl už desítky let. https://cs.wikipedia.org/wiki/Fat_binary

V podstatě zkompilujete strojový kód pro každou platformu, na které chcete běžet, a poté ručně propojíte kód s různými vstupními body. Zatímco článek na Wikipedii pouze popisuje zabalení různých architektur do stejného binárního souboru, je ve skutečnosti možné vytvořit jeden binární soubor, který běží na různých operačních systémech, pokud se vstupní body pro operační systémy nekolidují.

Některé spustitelné formáty byly záměrně navrženy tak, aby to umožňovaly. Například MZ, NE, LX a PE lze překrýt. Staré programy OS/2 to někdy dělaly... zřídka obsahovaly celý program pro oba operační systémy, ale při spuštění na DOSu se vytiskla zpráva, že jste pro program používali nesprávný operační systém.

Pokud jde o Linux a Windows v jednom binárním systému: I když nemůžete dělat ELF a PE, věřím, že může být proveditelné pomocí PIE nebo COFF a PE nebo COM. Starší Linux bude spouštět binární soubory COFF, z nichž PE pochází, takže se zdá, že byste mohli vytvořit univerzální binární pokud novější verze Linuxu je budou stále provozovat. Nemohu s jistotou říci, že by to fungovalo, ale zdá se to pravděpodobné.

Další upozornění:Obvykle musíte vložit skok do kódu hned na začátku, abyste přeskočili vstupní bod, záhlaví atd. jiného operačního systému, protože tam nemůžete svůj kód najít (samozřejmě).

Problém s tímto v moderních počítačích je, že většina antivirového softwaru jej nesprávně identifikuje jako virus. Dříve bylo běžné, že viry útočily na binární soubory vložením takového skoku na začátek spustitelného souboru, který skočil na konec binárního souboru, přilepením vlastního kódu na konec binárního souboru a poté vložením dalšího skoku zpět do hlavního spustitelného souboru. kód. Vzhledem k tomu, že pro podporu více platforem v jednom binárním souboru potřebujete udělat něco víceméně podobného, ​​většina AV softwaru to heuristicky identifikuje jako virus a uloží váš spustitelný soubor do karantény.

Takže ve zkratce:ANO to lze udělat pro (některé) kombinace platforem. Není to nemožné, ale museli byste být šílení, abyste to dokázali.


Linux
  1. Jak nainstalovat Wine a spouštět aplikace pro Windows v Linuxu

  2. Jak mohu symbolicky propojit soubor v Linuxu?

  3. pomocí linuxu, jak mohu předat obsah souboru jako parametr spustitelnému souboru?

  1. Jak mohu definovat DIRECTORY_SEPARATOR pro platformy Windows i Linux?

  2. Jak používat / (oddělovač adresářů) v Linuxu i Windows v Pythonu?

  3. Jak mohu spustit spustitelný soubor Windows z WSL (Ubuntu) Bash

  1. Jak převést linuxový spustitelný soubor (binární) na soubor Windows exe?

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

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