Errore di collegamento durante la compilazione dell'operazione atomica gcc in modalità 32 bit

StackOverflow https://stackoverflow.com/questions/130740

  •  02-07-2019
  •  | 
  •  

Domanda

Ho il seguente programma:

~/test> cat test.cc
int main()
{
  int i = 3;
  int j = __sync_add_and_fetch(&i, 1);
  return 0;
}

Sto compilando questo programma usando GCC 4.2.2 su Linux in esecuzione su una macchina Intel a 64 bit multi-CPU:

~/test> uname --all
Linux doom 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 x86_64 x86_64 GNU/Linux

Quando compilo il programma in modalità 64-bit, si compila e si collega bene:

~/test> /share/tools/gcc-4.2.2/bin/g++ test.cc
~/test>

Quando lo compilo in modalità a 32 bit, ottengo il seguente errore:

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 test.cc
/tmp/ccEVHGkB.o(.text+0x27): In function `main':
: undefined reference to `__sync_add_and_fetch_4'
collect2: ld returned 1 exit status
~/test>

Anche se non funzionerò mai su un processore a 32 bit, ho bisogno di un eseguibile a 32 bit in modo da poter collegarmi con alcune librerie a 32 bit.

Le mie 2 domande sono:

  1. Perché viene visualizzato un errore di collegamento durante la compilazione in modalità a 32 bit?

  2. Esiste un modo per far compilare e collegare il programma, pur essendo in grado di collegarsi con una libreria a 32 bit?

È stato utile?

Soluzione

Dalla pagina GCC su Atomic builtins :

  

Non tutte le operazioni sono supportate da   tutti i processori target. Se un particolare   l'operazione non può essere implementata sul   processore di destinazione, verrà visualizzato un avviso   generato e una chiamata esterna   la funzione verrà generata. Il   la funzione esterna avrà lo stesso   nome come incorporato, con un   suffisso aggiuntivo `_n 'dove n è il   dimensione del tipo di dati.

A giudicare dall'output del compilatore, che fa riferimento a __sync_add_and_fetch_4 , questo è ciò che sta accadendo. Per qualche motivo, GCC non sta generando correttamente la funzione esterna.

Questo è probabilmente il motivo per cui stai ricevendo un errore solo in modalità 32 bit: durante la compilazione per la modalità 64 bit, viene compilato più da vicino per il tuo processore. Durante la compilazione per 32 bit, è possibile che stia utilizzando un arco generico (ad esempio i386) che non supporta nativamente tali funzionalità. Prova a specificare un'architettura specifica per la tua famiglia di chip (Xeon, Core 2, ecc.) Tramite -mcpu e vedi se funziona.

In caso contrario, dovrai capire perché GCC non include la funzione appropriata che dovrebbe generare.

Altri suggerimenti

La risposta di Dan Udey era vicina, abbastanza vicina da consentirmi di trovare la vera soluzione.

Secondo la pagina man " -mcpu " è un sinonimo deprecato di " -mtune " e significa semplicemente "ottimizzare per una particolare CPU (ma ancora funzionare su CPU più vecchie, anche se meno ottimali)". Ho provato questo e non ha risolto il problema.

Tuttavia, " -march = " significa "generare codice per una CPU particolare (e non funzionare su CPU più vecchie)". Quando ho provato questo, ho risolto il problema: specificare una CPU di i486 o superiore ha eliminato l'errore di collegamento.

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32  test.cc
/tmp/ccYnYLj6.o(.text+0x27): In function `main':
: undefined reference to `__sync_add_and_fetch_4'
collect2: ld returned 1 exit status

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=i386 test.cc
/tmp/ccOr3ww8.o(.text+0x22): In function `main':
: undefined reference to `__sync_add_and_fetch_4'
collect2: ld returned 1 exit status

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=i486 test.cc

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=pentium test.cc
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top