Ich habe ein Programm, das auf meinem Entwicklungsrechner korrekt funktioniert, aber einen Fehler "Unzulässige Anweisung" erzeugt, wenn ich es auf einem "sauberen Rechner" teste, auf den nur die erforderlichen Dateien kopiert wurden.
Das Programm besteht aus meiner gemeinsam genutzten Bibliothek, die aus C++-Quellen erstellt wurde, und einem C-Wrapper-Beispielprogramm, das die Verwendung der Bibliothek demonstriert. Auf dem Entwicklungsrechner werden alle in Eclipse mit G++ erstellt und sowohl Debug als auch Release funktionieren einwandfrei. Eine Reihe von Standardbibliotheken sind eingebunden.
Um Abhängigkeiten zu testen, die ich vielleicht übersehen habe, habe ich die .c-Datei, die .so-Datei meiner Bibliothek und die .h-Datei der Bibliothek auf eine neue Linux-Installation kopiert und sie mit einem einfachen Skript kompiliert/verlinkt, das mit den gleichen Release-Compile-Optionen erstellt wurde, die Eclipse verwendet. Beide Maschinen haben g++ 4.3.2.
Wenn ich das Programm auf dem sauberen Rechner ausführe, wird es sofort mit der Meldung "Illegal instruction" beendet.
Die Ausführung in gdb erzeugt:
(gdb) run
Starting program: /home/sfallows/Source/Apps/MySample/MySample
[Thread debugging using libthread_db enabled]
[New Thread 0xb5c4ca90 (LWP 7063)]
Program received signal SIGILL, Illegal instruction.
[Switching to Thread 0xb5c4ca90 (LWP 7063)]
0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
77 static ios_base::Init __ioinit;
Current language: auto; currently c++
(gdb) bt
#0 0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
#1 0xb7f0cb48 in global constructors keyed to _ZN8NodeLockC2Ev () at ../NodeLock.cpp:194
#2 0xb7f204ad in __do_global_ctors_aux () from /home/sfallows/Source/Apps/MySample/libMyLib.so
#3 0xb7ee5c80 in _init () from /home/sfallows/Source/Apps/MySample/libMyLib.so
#4 0xb7fe1de4 in ?? () from /lib/ld-linux.so.2
#5 0x00000001 in ?? ()
#6 0xbf8e6b74 in ?? ()
#7 0xbf8e6b7c in ?? ()
#8 0x00000007 in ?? ()
#9 0xbf8e6b2c in ?? ()
#10 0x00000001 in ?? ()
#11 0x00000001 in ?? ()
#12 0xb7feeff4 in ?? () from /lib/ld-linux.so.2
#13 0x00000000 in ?? ()
(gdb) Quit
Ich bin nicht sicher, warum es statische Konstrutoren in NodeLock.cpp ausgeführt wird. Ich habe weder statische/globale Objekte in dieser Datei noch irgendwelche statischen/globalen Objekte dieser Klasse irgendwo.
Der Entwicklungsrechner ist ein Intel Core2 Quad und der saubere Rechner ist ein Pentium 4 Dual. Ich gehe davon aus, dass G++ standardmäßig eine gemeinsame Teilmenge von x86-Anweisungen verwendet und dass der Prozessorunterschied nicht mein Problem ist.
Ich bin für jeden Vorschlag dankbar, was ich sonst noch in Betracht ziehen könnte. Ich versuche zu vermeiden, alle Bibliotheksquellen und Abhängigkeiten auf der sauberen Maschine zu installieren.
Zu rmn's Antwort und John Boker's Kommentar: In der Windows-Welt laufen exes und dlls auf einer Vielzahl von Intel- und AMD-Prozessoren, so dass es eindeutig eine weit verbreitete gemeinsame Untermenge von Anweisungen gibt. Ich dachte, gcc würde dasselbe tun? Ich denke, ich werde die Befehlssatz-/Architekturoptionen gründlich untersuchen.