2013-01-13 7 views
7

Per prima cosa desidero dichiarare per la cronaca che questa domanda è correlata a scuola/compiti a casa.Compatibilità file di oggetti C tra computer

Supponiamo che i computer CP1 e CP2 condividano lo stesso sistema operativo e il medesimo linguaggio macchina. Se un CP è compilato su CP1, per spostarlo su CP2, è necessario trasferire il codice sorgente e ricompilare su CP2, o semplicemente trasferire i file oggetto.

La mia risposta istintiva è che i file oggetto dovrebbero essere sufficienti. Il codice C è tradotto in assembly dal compilatore e assemblato in codice macchina dall'assemblatore. Poiché l'architettura condivide lo stesso codice macchina e il medesimo sistema operativo, non vedo alcun problema.

Ma più ci penso, più confuso sto iniziando a ottenere.

Le mie domande sono:

a) Fin dal suo riferimento al file oggetto e non eseguibili, sto assumendo non c'è stato alcun collegamento. Ci sarebbero problemi di superficie durante il collegamento su CP2?

b) Sarebbe importante se il codice utilizzato C11 standard su CP1, ma l'unico compilatore su CP2 era C99? Presumo che ciò sia irrilevante una volta che il codice è stato compilato/assemblato.

c) La domanda non specifica le librerie collegate condivise/dinamiche. Quindi questo funzionerebbe davvero solo se il programma non avesse dipendenze da file .dll/.so/.dylib, altrimenti questi sarebbero richiesti anche su CP2.

Mi sento come se ci fossero così tanti trucchi e, considerando quanto sia vaga la domanda, ora sento che sarebbe più semplice ricompilare semplicemente.

Halp!

+0

distcc, che copia i file oggetto tra computer, consiglia di utilizzare la stessa versione del compilatore su tutti i nodi, anche per il linguaggio C. – aschepler

risposta

3

La risposta è, dipende. Quando si compila un programma C e si spostano i file oggetto per collegarsi su un altro computer, dovrebbe funzionare. Tuttavia, a causa di fattori come endianness o name mangling, il tuo programma potrebbe non funzionare come previsto e potrebbe persino bloccarsi quando si tenta di eseguirlo.

C11 non è supportato da un compilatore C99, ma non importa se la sorgente è stata compilata e assemblata.

Finché la sorgente viene compilato con le librerie su una macchina, non è necessario le librerie da collegare o eseguire il file (s) su un altro computer (librerie statiche solo, librerie dinamiche dovranno essere sul computer su cui si esegue l'applicazione). Detto questo, dovresti rendere il programma indipendente in modo da non incorrere negli stessi problemi di prima in cui il programma non funziona come previsto o si blocca.

Si potrebbe ottenere un compilatore che supporta EABI in modo da non incorrere in questi problemi. I compilatori che supportano EABI creano codice oggetto compatibile con il codice generato da altri compilatori di questo tipo, consentendo quindi agli sviluppatori di collegare librerie generate con un compilatore con codice oggetto generato con un compilatore diverso.

Ho provato a farlo prima, ma non molto, e non di recente. Pertanto, le mie informazioni potrebbero non essere accurate al 100%.

+0

"Non hai bisogno delle librerie" - questo è vero solo per il collegamento statico. Le librerie dinamiche sono referenziate dal tuo programma, non compilato in esso. Il programma non si avvia se mancano. –

+0

Grazie per averlo capito, modifica fatta. – syb0rg

+0

La tua rev 2 ha sostanzialmente ragione, dovresti menzionare il nome mangling e la compatibilità in runtime, ci sono sistemi in cui puoi effettivamente chiedere diversi tipi di output di file oggetto, per quando un nuovo [ABI] (http://en.wikipedia.org)/wiki/Application_binary_interface) è molto meglio che vale la pena riscrivere la toolchain per ottenerla. – jthill

1

a) Ho già sentito il termine "file oggetto" utilizzato per riferirsi ai binari collegati, anche se è un po 'impreciso. Quindi forse significano "binari".Direi che il collegamento su una macchina diversa potrebbe essere problematico se ha un compilatore diverso - a meno che i formati di file oggetto non siano standardizzati, cosa di cui non sono sicuro.

b) L'uso di standard diversi o anche di compilatori non ha importanza per il codice binario, se è collegato in modo statico. Se si basa su funzioni da una lib dinamica, potrebbero esserci problemi. Che risponde c) pure: sì, questo sarà un problema. Il programma non verrà avviato se non ha tutte le librerie dinamiche richieste nella versione corretta. Dipende dalla modalità di collegamento (statico rispetto dinamico), di nuovo.

0

D: Supponiamo che i computer CP1 e CP2 condividano lo stesso sistema operativo e il medesimo linguaggio macchina.

A: Quindi è possibile eseguire le stesse .exe su entrambi i computer

D: Se un programma C viene compilato il CP1, al fine di spostarlo in CP2, è necessario trasferire il codice sorgente

A: No. È necessario solo il codice sorgente se si desidera ricompilare. È necessario ricompilare solo se si tratta di una CPU e/o un sistema operativo diversi e incompatibili.

"file oggetto" non sono generalmente necessari a tutti per l'esecuzione del programma:

http://en.wikipedia.org/wiki/Object_files

un file oggetto è un file contenente codice macchina formato rilocabile che di solito non è direttamente eseguibile. I file oggetto sono prodotti da un assemblatore, compilatore o un altro traduttore di lingua e utilizzati come input nel linker.

Un "programma eseguibile" potrebbe richiedere una o più "librerie condivise" (alias .dll). In questo caso si applicano le stesse restrizioni: le librerie condivise, se non già residenti, devono essere copiate insieme a .exe e devono anche essere compatibili con CPU e sistema operativo.

Infine, è necessario ricompilare gli "script" non. Puoi copiare lo script liberamente da un computer all'altro. Ma ogni computer deve avere un "interprete" per eseguire lo script: uno script Perl ha bisogno di un interprete Perl, uno script Python un interprete python e così via.