Recentemente stavo combattendo alcuni problemi nel tentativo di compilare una libreria open source sul mio Mac che dipendesse da un'altra libreria e che avesse degli errori sulle architetture di libreria incompatibili. Qualcuno può spiegare il concetto alla base della compilazione di un programma C per un'architettura specifica? Ho visto il flag del compilatore -arch
prima e ho visto valori passati ad esso come ppc
, i386
e x86_64
che presumo le mappe per il "linguaggio" della CPU, ma la mia comprensione si ferma lì. Se un programma utilizza una particolare architettura, tutte le librerie che carica devono essere sulla stessa architettura? Come posso dire a quale architettura è in esecuzione un determinato programma/processo?Compilare un programma C con un'architettura specifica
risposta
Qualcuno può spiegare il concetto alla base della compilazione di un programma C per un'architettura specifica?
Sì. L'idea è di tradurre C in una sequenza di istruzioni macchina native, che hanno il programma codificato in forma binaria. Il significato di "architettura" qui è "instruction-set architecture", che è il modo in cui le istruzioni sono codificate in binario. Ad esempio, ogni architettura ha il proprio modo di codificare per un'istruzione che aggiunge due interi.
Il motivo per compilare le istruzioni della macchina è che funzionano molto, molto velocemente.
Se un programma utilizza un'architettura particolare, tutte le librerie che carica devono essere sulla stessa architettura?
Sì. (Esistono eccezioni ma sono rari.)
Come posso sapere a quale architettura è in esecuzione un dato programma/processo?
Se un processo è in esecuzione su hardware, è in esecuzione su l'architettura originaria, che su Unix si può scoprire eseguendo il comando uname -m
, anche se per il lettore umano l'uscita dal uname -a
può essere più informativo.
Se si dispone di un binario eseguibile o una libreria condivisa (.so file), è possibile scoprire la sua architettura con il comando file
:
% file /lib/libm-2.10.2.so
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
% file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
Si può vedere che questi binari sono stati compilati per le persone molto anziane Architettura 80386, anche se il mio hardware è un i686 più moderno. L'i686 (Pentium Pro) è retrocompatibile con 80386 ed esegue binari 80386 oltre a binari nativi. Per rendere possibile questa retrocompatibilità, Intel ha causato molti problemi e spese — ma praticamente ha messo le mani sul mercato per le CPU desktop, quindi ne è valsa la pena!
Per creare un'architettura diversa da quella nativa della CPU, è necessario un cross-compiler, il che significa che il codice generato non può essere eseguito in modo nativo sulla macchina su cui si sta seduti. GCC può fare questo bene. Per scoprire quale architettura un programma è stato creato per controllare il comando file. Almeno nei sistemi basati su Linux, un programma x86 a 32 bit richiede che le librerie x86 a 32 bit vadano d'accordo. Suppongo che sia lo stesso per la maggior parte dei sistemi operativi.
Una cosa che può confondere qui è che la piattaforma Mac ha quello che chiamano uno universal binary, che è in realtà due binari in un archivio, uno per Intel e l'altro per l'architettura PPC. Il tuo computer deciderà automaticamente quale deve essere eseguito. È possibile (a volte) eseguire un binario per un'altra architettura in una modalità di emulazione e alcune architetture sono superserie di altre (ad esempio il codice i386 verrà eseguito generalmente su un i486, i586, i686, ecc.) Ma per la maggior parte l'unico codice è possibile eseguire è un codice per l'architettura del processore.
Per la compilazione incrociata, non solo il programma, ma tutte le librerie che utilizza, devono essere compatibili con il processore di destinazione. A volte questo significa avere un secondo compilatore installato, a volte è solo una questione di avere il modulo aggiuntivo giusto per il compilatore disponibile. Il cross-compilatore per gcc is actually a seperate executable, though it can sometimes be accessed via a command line switch. I compilatori gcc cross per varie architetture sono probabilmente installazioni separate.
L'aiuto ldd in questo caso?
- 1. Compilare un programma C++ con gcc
- 2. Come compilare C# con lingua specifica Versione
- 3. Come compilare un programma con libcurl statico?
- 4. Impossibile compilare il programma C++
- 5. Compilare automaticamente due versioni del programma C#
- 6. Come compilare un programma SDL di esempio scritto in C?
- 7. Come compilare un programma C per Genymotion (Android x86)
- 8. Come compilare un programma usando OpenCV 2.4.3 con Code :: Blocks?
- 9. Impossibile compilare un semplice programma C++ in Ubuntu
- 10. Compilare un file Java ... con un programma Java
- 11. Compilare una libreria boost specifica
- 12. Come posso compilare un programma Go?
- 13. Collegamento di un programma C++ con SpiderMonkey?
- 14. Compilare il codice Python e collegarlo al programma C++?
- 15. Come compilare ed eseguire un semplice programma C con Sublime Text 2?
- 16. Compilare un programma C++ con dipendenza solo su kernel32.dll e user32.dll?
- 17. Compilare C Source con Makefile in Windows
- 18. Come compilare il programma C senza alcuna ottimizzazione
- 19. Compilare programma in C++ su Mac per funzionare su Linux
- 20. Come posso compilare il programma Mongodb-c-driver?
- 21. Come compilare ed eseguire un programma C/C++ sul sistema Android
- 22. Come compilare il programma WPF con la riga di comando?
- 23. Come compilare un programma C++ come 64-bit su un computer a 64 bit?
- 24. Compilare codice C# nell'applicazione
- 25. Come compilare questo programma con in linea asm?
- 26. Compilare C# nell'obiettivo-C
- 27. Compilare usando MONO - C# con riferimento a una libreria C#?
- 28. Compilare C# in Nativo?
- 29. programma C++ compatibile con Windows 95
- 30. Compilare in C++ 14