Ich kämpfe seit mehr als einer Woche mit diesem Problem und kann immer noch keine Lösung finden ...
Ich versuche Qt 4.7 Embedded-Open-Source-Version für ein ARM-Gerät Cross-kompilieren. Der Build-Prozess selbst schließt ohne Probleme ab, aber die generierten Binärdateien scheinen Anweisungen zu enthalten, die der Prozessor nicht versteht.
qmake.conf
basierend auf linux-arm-gnueabi-g++
und angepasst, um die richtige Toolchain zu verwenden - siehe Quellcode hier
-msoft-float -D__GCC_FLOAT_NOT_NEEDED
zu den Compiler-Flags erhalten, bekomme aber trotzdem < Illegal instruction -Fehler in einige Situationen (aber das war zumindest eine große Verbesserung) -mcpu=xscale
, -march=armv4
, -O0
, -march=armv4
, -mtune=arm920t
(nicht alle gleichzeitig) hat in keiner Weise geholfen. --debug
-Flag scheint alle Probleme zu lösen , aber das Hinzufügen des -O2
-Flags führt sie wieder ein. Seltsamerweise hilft die Einstellung -O0
ohne --debug nicht . configure
und make
ist hier zu sehen. Es gibt viele Alignment-Warnungen, aber es wird gesagt, dass sie falsche Warnungen des Compilers sind . configure
Einstellungen:
strace vor dem Absturz:
%Vor%gdb backtrace des Absturzes (Ich vermisse Debug-Symbole, da das Kompilieren mit Debug-Informationen das Problem behebt):
%Vor%Beachten Sie, dass das Gerät mit Qtopia 4.3 vorinstalliert ist und der Hersteller das Problem mit meinem Build auch nicht erklären kann.
Mit Hilfe von Igor Skochinsky konnte ich die genaue Assembleranweisung finden, die den SIGILL verursacht. Aus irgendeinem Grund funktioniert die Anweisung für 47 mal , bevor der Fehler verursacht wird. Siehe gdb
output unten (beachten Sie, dass ich ARM Assembler überhaupt nicht kenne):
Irgendwelche Vorschläge, was ich als nächstes versuchen könnte?
Die geteilte Disassemblierung ist ziemlich interessant.
%Vor%Der Code prüft auf Bit 9 in fpscr und, falls gesetzt, versucht er, die Register f2-f7 zu speichern. Was sind diese? Ich habe sie noch nie in den letzten Prozessoren gesehen, aber ich denke, dass es sich um FPA-Register ("Floating Point Accelerator" -Register) handelt, die in einigen alten Kernen implementiert sind und für Soft-FPs verwendet wurden, bevor VFP erschien.
Also, hier ist, was ich denke passiert:
Ich sehe hier zwei Optionen:
Aktualisieren : Ich habe mich geirrt. Die Demontage von gdb hat mich verwirrt. Ich habe die Quelle von setjmp.S, hier ist der relevante Teil:
%Vor%Es versucht also, WMMXt-Register zu speichern, nicht FPA. Allerdings gibt es hier einen Fehler. Es verwendet r2, um fpscr vorübergehend zu speichern, aber , das den zuvor geladenen hwcap-Wert in a3 überschreibt (a3 ist das APCS-Name für r2). Vielleicht wollte der Autor a2, nicht r2, oder vielleicht wurden die beiden Teile von verschiedenen Leuten gemacht. In beiden Fällen ändert die Release-Version von Qt irgendwie FPSCR (was höchstwahrscheinlich vom Kernel emuliert wird) und der Code, der iwmmxt regs speichert, wird ausgelöst.
Trotzdem ist das nicht die ganze Geschichte. Die , die Sie eingefügt , behaupten, dass die CPU iWMMXt unterstützt, also bin ich mir nicht sicher, warum diese Anweisungen Probleme bereiten würden. Vielleicht ist der gemeldete PC-Wert irgendwie falsch. Ich denke, du solltest versuchen, einen Haltepunkt auf __sigsetjmp zu setzen und durch Anweisungen (Schritt) hindurchzugehen, um zu sehen, wo genau es abstürzt.
Hallo, ich hatte vor ein paar Tagen ein ähnliches Problem ... Aber ich habe Qt Creator 5.7 auf meinem Slackware Linux im VMware-Player (nicht ARM-Gerät) ausgeführt.
Nach erfolgreicher Installation konnte ich Qt Creator nicht starten. Ich habe versucht, Qt Creator mit dem folgenden Terminal-Befehl /opt/Qt5.7.0/Tools/QtCreator/bin/qtcreator
auszuführen, und es gab mir einen Fehler Illegal instruction
.
Nach ein paar Stunden mit Google habe ich versucht, Qt Creator mit diesen Terminalbefehlen /opt/Qt5.7.0/Tools/QtCreator/bin/qtcreator -noload Welcome
zu starten, und das funktionierte für mich.
Hoffe, das hilft jemandem. Entschuldigung für eine späte Antwort.
Tags und Links qt cross-platform arm cross-compiling