2010-03-13 16 views
11

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

13

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!

1

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.

3

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.

1

L'aiuto ldd in questo caso?

Problemi correlati