Un eseguibile di Linux è “compatibile” con OS X?

Se si compila un programma in dire, C, su una piattaforma basata su Linux, quindi lo si porta per usare le librerie MacOS, funzionerà?

Il codice macchina principale viene da un compilatore compatibile su Mac e Linux?

Il motivo per cui lo chiedo è perché entrambi sono “basati su UNIX”, quindi penso che sia vero, ma non ne sono sicuro.

No, i file binari di Linux e Mac OS X non sono cross-compatibili.

Per prima cosa, gli eseguibili di Linux usano un formato chiamato ELF .

Gli eseguibili di Mac OS X utilizzano il formato Mach-O .

Pertanto, anche se molte librerie ordinariamente si compilano separatamente su ciascun sistema, non sarebbero portatili in formato binario.

Inoltre, Linux non è in realtà basato su UNIX. Condivide un numero di funzionalità e strumenti comuni con UNIX, ma molto ha a che fare con gli standard di calcolo come POSIX.

MODIFICARE:

Infine, per indirizzare il punto sul codice byte: quando si crea un binario, i compilatori generano di solito un codice macchina specifico per la piattaforma su cui si sta sviluppando. (Questo non è sempre il caso, ma di solito è.)

In generale puoi facilmente portare un programma su vari marchi Unix. Tuttavia è necessario (almeno) ricompilarlo su ogni piattaforma.

I file eseguibili (file binari) non sono utilizzabili su più piattaforms, poiché un eseguibile è strettamente collegato all’ABI del sistema operativo ( Application Binary Interface ), ovvero le convenzioni su come un’applicazione comunica con il sistema operativo.

Ad esempio se il tuo programma stampa una stringa sulla console usando la chiamata di write POSIX, l’ABI specifica:

  • Come è fatta una chiamata di sistema (Linux usato per chiamare l’interrupt del software 0x80 su x86, ora usa l’istruzione sysenter specifica)
  • Il numero di telefono del sistema
  • Come vengono trasmessi gli argomenti della funzione al sistema
  • Qualsiasi tipo di allineamento

E questo varia molto da un sistema operativo all’altro.

Si noti tuttavia che in alcuni casi possono esistere “adattatori ABI” che consentono di eseguire i binari di un sistema operativo su un altro sistema operativo. Ad esempio, Wine consente di eseguire file eseguibili di Windows su vari gusti Unix, NDISwrapper consente di utilizzare i driver di rete di Windows su Linux.

“bytecode” di solito si riferisce al codice eseguito da una macchina virtuale (ad es. per java o python). C è compilato per codice macchina, che la CPU può eseguire direttamente. Il linguaggio macchina è specifico dell’hardware in modo che sia lo stesso in qualsiasi sistema operativo su un chip Intel (anche in Windows), ma i dettagli su come il codice macchina è racchiuso in un file eseguibile e come è integrato con le chiamate di sistema e le librerie collegate dynamicmente sono diverse da sistema a sistema.

Quindi no, non puoi prendere il codice compilato e usarlo in un sistema operativo diverso. (Tuttavia, ci sono “cross-compilers” che girano su un SO ma generano un codice che girerà su un altro SO).

Non esiste un “codice byte core che proviene da un compilatore”. C’è solo il codice macchina .

Mentre le stesse istruzioni di macchina possono essere applicabili in diversi sistemi operativi (purché vengano eseguite sullo stesso hardware), c’è molto di più per un eseguibile ospitato rispetto a quello, e dal momento che un eseguibile nativo compilato e collegato per Linux ha molto diverso requisiti di runtime e di libreria da uno su BSD o Darwin, non sarà ansible eseguire un binario sull’altro sistema.

Al contrario, i binari di Windows possono a volte essere eseguiti sotto Linux, perché Linux fornisce sia un caricatore di formati binario per il formato PE di Windows, sia un’estesa implementazione API (Wine). In linea di principio questa idea può essere utilizzata anche su altre piattaforms, ma non sono a conoscenza di nessuno che abbia scritto questo per Linux <-> Darwin. Se hai già il codice sorgente e lo compila in Linux, allora hai buone possibilità che compili anche sotto MacOS (componenti UI modulo, ovviamente).

Beh, forse … ma molto probabilmente no.

Ma se lo fa, non è “perché entrambi sono UNIX” è perché:

  • Al giorno d’oggi i computer Mac usano lo stesso processore (questo era molto diverso in passato)
  • Ti capita di usare un programma che non ha alcuna dipendenza da nessuna libreria (molto improbabile)
  • Ti capita di usare le stesse librerie di runtime
  • Ti capita di usare un caricatore / formato binario compatibile con entrambi.