È possibile utilizzare il compilatore Intel C / C ++ su Linux per creare file oggetto da collegare su Windows?

12

Perché?

A seconda della fonte, è probabile che il compilatore Intel o il compilatore generino i file eseguibili più veloci per l'architettura x86 (miglioramento del tempo di esecuzione dal 5% al 100%).

Intel offre i suoi compilatori per Linux con una licenza non commerciale gratuitamente (penso di aver letto che è libero da qualche parte sulla loro pagina: Intel - Sviluppo software non commerciale ). Esiste anche una licenza gratuita non commerciale per gli studenti, ma questa licenza non è applicabile sebbene siano offerti strumenti per tutti e tre i principali sistemi operativi (il collegamento è stato interrotto a causa della restrizione della reputazione).

Obiettivo

I (come non studente) vorrebbe essere in grado di utilizzare i compilatori Intel per possibili miglioramenti della velocità di esecuzione sotto licenza non commerciale per compilare file oggetto che possono essere collegati per creare eseguibili e librerie di collegamenti dinamici per Windows ( e possibilmente OS X)

Altri dettagli:

Che cosa ho dedotto da questo documento è che i compilatori Intel creano file oggetto compatibili con i compilatori dominanti della piattaforma.

sotto-domande:

  1. Quali sono i formati di file oggetto di gcc, g ++, cl, mingw32, icc, icpc e icl su Windows e Linux (versioni correnti)?
  2. È possibile utilizzare parti della toolchain cross-compiler mingw32 per raggiungere l'obiettivo?
  3. Ho ragione che i metadati nei file oggetto generati sono il problema principale?

annuncio 2:
mingw32-objcopy sembra essere in grado di convertire l'output del compilatore Intel su Linux (presumibilmente ELF) su COFF compatibile con Microsoft (con la possibile eccezione di file oggetto rilocabili). Qualcuno potrebbe confermare che questo funziona davvero (per applicazioni non banali), per favore?

    
posta Hugo 15.05.2013 - 12:34
fonte

4 risposte

1

È possibile creare eseguibili di Windows su una macchina di compilazione Linux usando un cross-compiler. Ma Intel non fornisce tali cross-compilers.

Per rispondere alle domande secondarie:

What are the object file formats of gcc, g++, cl, mingw32, icc, icpc, and icl on Windows and Linux (current versions)?

Il formato per i file oggetto è effettivamente determinato dal sistema operativo (o meglio, il compilatore utilizzato per costruirlo). Per Windows, questo è il formato Portable Executable (PE) e per Linux ELF formato.

Could parts of the mingw32 cross-compiler toolchain be used to accomplish the goal?

No. La parte rilevante è il generatore di codice, che è sia la parte responsabile della generazione del giusto formato di oggetto sia la parte sui compilatori Intel che dà il loro codice generato al limite della velocità.

Am I right that the metadata in the generated object files is the main issue?

No. È un problema, ma ce ne sono altri. Un problema più fondamentale è la potenziale differenza nel modo in cui i parametri vengono passati al kernel e / o alla libreria standard. IIRC, quelle convenzioni sono diverse tra Windows e Linux.

    
risposta data 15.05.2013 - 17:29
fonte
0

La risposta è quasi certamente sì. So che i binari di compilazione incrociata di Windows (tramite mingw32 ) su una macchina Linux sono facilmente possibili usando gcc - ovviamente hai vinto ' essere in grado di eseguire il programma su Linux (a meno che non funzioni con Wine), ma conosco diversi programmi che ottengono i binari di Windows in questo modo.

Tuttavia, non so se il compilatore Intel ha le opzioni per questo, dovrei pensarlo.

Il formato dell'oggetto per Windows è PE , mentre per Linux il suo ELF .

    
risposta data 15.05.2013 - 14:17
fonte
0

Con il codice C che collega a zero (direttamente) che usa le convenzioni di chiamata personalizzate di Microsoft, potresti avere una possibilità usando objcopy di MinGW. L'ho usato per convertire un file oggetto assemblato, ma poi non dovevo preoccuparmi di chiamare le convenzioni.

Vorrei solo passare il tempo che vorresti fare, invece di ottenere GCC o clang per fare esattamente quello che vuoi. Se una tale accelerazione è davvero così importante, compila un binario Linux con il compilatore Intel e prova a vedere esattamente cosa, se non del tutto, accelera il tuo codice. È possibile correggere l'assembly se tutto il resto fallisce.

    
risposta data 16.05.2013 - 02:51
fonte
0

Propongo la seguente risposta:

Un preciso forse (inclinato verso sì) con un ma riguardo al contesto.

Spiegazione: Per quanto riguarda la parte "pendente": non sembra essere una totale perdita di tempo per provare questo, ma (la parte "put") tenendo conto di questa risposta probabilmente non otterrà i miglioramenti del tempo di esecuzione rispetto a una toolchain solo per Intel. La parte rilevante è il linker e il feedback di runtime al compilatore (ottimizzazione dell'intero programma, ottimizzazione guidata dal profilo, generazione del codice link-time).

Ulteriori dettagli:
Secondo le Domande frequenti su MinGW ci sono problemi con l'uso di librerie e DLL:
"Sebbene le DLL debbano essere abbastanza portabili tra diversi compilatori di Windows, l'accesso alle DLL attraverso un file di libreria (.lib o .a) non lo è. I formati di file di libreria sono specifici per particolari compilatori e non possono essere utilizzati in modo portabile con diversi compilatori a meno che il compilatore fornisce il supporto per questo. "

Per completare la risposta:
sotto-domanda 1:

What are the object file formats of gcc, g++, cl, mingw32, icc, icpc, and icl on Windows and Linux (current versions)?

Il formato file oggetto predefinito per qualsiasi compilatore su Windows è COFF (probabilmente il PE variante). Il formato file oggetto predefinito per qualsiasi compilatore su Linux è ELF

domanda secondaria 2:

Could parts of the mingw32 cross-compiler toolchain be used to accomplish the goal?

Molto probabilmente sì (per la parte di collegamento), ma molto probabilmente non si otterranno molti miglioramenti nel tempo di esecuzione.

domanda secondaria 3:

Am I right that the metadata in the generated object files is the main issue?

Per quanto riguarda il collegamento: sì.

    
risposta data 24.05.2013 - 07:02
fonte

Leggi altre domande sui tag