Link Fehler beim gcc Atom Betrieb in 32-Bit-Modus kompiliert
Frage
Ich habe folgendes Programm:
~/test> cat test.cc
int main()
{
int i = 3;
int j = __sync_add_and_fetch(&i, 1);
return 0;
}
Ich bin die Erstellung dieses Programms GCC 4.2.2 auf Linux auf einem Multi-CPU 64-Bit-Intel-Rechner ausgeführt wird:
~/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
Wenn ich das Programm in 64-Bit-Modus kompilieren, kompiliert und verknüpft fein:
~/test> /share/tools/gcc-4.2.2/bin/g++ test.cc
~/test>
Wenn ich es in 32-Bit-Modus kompilieren, bekomme ich folgende Fehlermeldung:
~/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>
Obwohl ich nie wirklich laufe auf einem 32-Bit-Prozessor, ich brauche ein 32-Bit-Programm, so kann ich mit einigen 32-Bit-Bibliotheken verknüpfen.
Meine 2 Fragen sind:
-
Warum erhalte ich einen Link Fehler, wenn ich in 32-Bit-Modus kompilieren?
-
Gibt es eine Möglichkeit, das Programm zu kompilieren und Link zu bekommen, während immer noch mit einer 32-Bit-Bibliothek verknüpfen zu können?
Lösung
Von der GCC Seite auf Atomic builtins :
Nicht alle Operationen werden unterstützt durch alle Zielprozessoren. Wenn eine bestimmte Vorgang kann nicht auf die umgesetzt werden Zielprozessor, wird eine Warnung sein erzeugt, und ein Anruf ein externes Funktion wird generiert. Das externe Funktion tragen die gleiche Namen wie das Builtin, mit einem zusätzliche Suffix `_n‘, wobei n die ist Größe des Datentyps.
Geht man von der Compiler-Ausgabe, die __sync_add_and_fetch_4
bezieht, ist das, was passiert. Aus irgendeinem Grund Erzeugung GCC nicht die externe Funktion richtig.
Dies ist wahrscheinlich, warum Sie nur einen Fehler in dem 32-Bit-Modus bekommen - wenn für 64-Bit-Modus kompiliert, es enger für Ihren Prozessor kompiliert. Wenn für 32-Bit kompiliert, kann es durchaus einen generischen Bogen (i386, zum Beispiel) verwenden, die nativ nicht diese Funktionen unterstützen. Versuchen Sie, eine bestimmte Architektur für Ihre Chip-Familie spezifiziert (Xeon, Core 2, etc.) über -mcpu und sehen, ob das funktioniert.
Wenn nicht, werden Sie herausfinden, warum GCC umfasst nicht die entsprechende Funktion, dass es zu erzeugen werden sollte.
Andere Tipps
Die Antwort von Dan Udey war in der Nähe, nahe genug, in der Tat, mir zu erlauben, die wirkliche Lösung zu finden.
Nach der Manpage „-mcpu“ ist ein veraltetes Synonym für „-mtune“ und nur bedeutet „Optimierung für eine bestimmte CPU (aber immer noch älteren CPUs läuft auf, wenn auch weniger optimal)“. Ich versuchte dies und es das Problem nicht lösen.
Doch „-march =“ bedeutet „Code für eine bestimmte CPU erzeugen (und nicht älteren CPUs läuft auf)“. Als ich das versuchte, löste es das Problem:. Eine CPU von i486 oder besser Angabe des Verbindungsfehlers losgeworden
~/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