关于qte illegal instruction的一些心得
????? 主機:ubuntu11.04
????? 交叉編譯器:arm-linux-gcc-4.3
????? 開發板:TQ2440,arm9 ,armv4t
? 一 > 我們的程序為什么會收到IllegaI Instruction的錯誤呢:
? 參考:http://blog.chinaunix.net/space.php?uid=22767658&do=blog&id=1749758
?????? 程序出現illegal instruction的原因是因為我們的進程在運行的過程中收到了SIGILL信號,而這個信號是由cpu在發現一個非法指令之后發出一個異常,然后有負責處理該異常的ISR(中斷服務程序)對包含有這個非法指令的進程發出的,我們的進程在收到這個信號之后,一般就會報告一個illegal instruction的錯誤信息。
??????? 可執行程序含有非法指令的原因,一般就是cpu的架構不對,編譯時制定的march和實際執行的機器的march不符。在這種情況下,因為工具鏈一樣,鏈接腳本一樣,所以可執行程序可以執行,不會發生程序格式錯誤。但是會包含一些不兼容的指令。另外就是有可能程序的執行權限不夠所造成的。
二 >?既然有可能是march不匹配的問題,就要想辦法進行嘗試啊,怎么才能修改編譯時制定程序的march是arm呢,對了,我們的arm9用armv4t,內核是arm920t,可是需要修改哪個文件呢,在網絡上找到這樣一篇文章:http://wiki.linuxmce.org/index.php/Mini2440_Orbiter_setup_and_FAQ#What_compiler_switches_do_I_need_to_build_working_code_on_a_mini2440.3F
What compiler switches do I need to build working code on a mini2440?
If you're staring at "illegal instruction error" problems, and using arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2008q3-72) 4.3.2, you need this:
? ??-msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
看來在我們編譯qt程序時,需要顯示的指定這些參數,但是,問題還是沒解決啊,在哪個文件中添加這些選項呢? 請看三
三 > 在講到需要修改的文件之前,我先插入一點自己的理解,無論是我們使用天嵌自帶的qt4.5的源碼,還是從網絡上下載最新的qt4.7.4(目前是最新的),我們所要做的就那么三步:1)./configure 2) make 3) make install;可是在1)中是比較令人頭疼的,因為如果你直接./configure的話,編譯的是針對X86的X11的qt庫,所以你需要在./configure 後添加-embedded arm的選項,還需要制定交叉編譯器,所以就需要在qt源碼包下使用:./configure -embedded -help來查看該源碼包支持那些配置選項,了解這些選項之后,就可以編譯生成最適合自己的qt庫了,我沒搞明白自己需要哪些庫,所以我就按照天嵌科技的配置選項來配置,然后make;make install,最好指定一下自己生成庫的路徑,即配置-prefix的選項;
????? 好,當明白了怎么編譯源碼庫之后,就開始干活,包括./configure;make;make install;將生成的庫copy到自己的開發板下;設置庫路徑;交叉編譯一個最簡單的hello world的qt程序,然后將可執行文件復制到開發板的/bin目錄下,運行還是會提示:illegal instruction
四> 當我們明白是怎樣編譯qt庫,并將庫復制到文件系統中,運行測試程序出現 :illegal instruction錯誤時,我們可以參考一下這幾篇文章:
http://stackoverflow.com/questions/5621393/illegal-instruction-when-cross-compiling-qt-4-7
http://www.kuche361.com/ht/view/id-39165
http://pastebin.com/D3RECiUj
其中http://www.kuche361.com/ht/view/id-39165這篇文章說的比較具體一點,在./configure之前,按照該文章進行配置,結果是能夠正常運行的;我有部分沒有按照他的做,那就是修改/mkspecs/common/g++.conf文件的QMAKE_CFLAGS_RELEASE += -O2 為QMAKE_CFLAGS_RELEASE += -O0,即對自己的程序不進行優化,我沒有修改,結果還是能正常運行,qt啊,真是讓人琢磨不透啊;不過,既然不提示非法指令,已經向前前進一大步了;
??? 我用同樣的方法,制作了一個qt4.7.4版本的qte庫,并用該庫制作了一個簡單的qt程序,在控制端該程序也不提示錯誤,沒有任何征兆,在arm板上就是不能彈出界面,令人好生糾結啊;不過既然4.5的能夠工作了,先做著,項目還是要向前走的;qt4.7.4的問題,既然已經有思路了,就慢慢的來搞吧。
附錄:
我制定-prefix為/opt/EmbedSky/qt-4.5/__install/arm/
/opt/EmbedSky/qt-4.5/qt-embedded-linux-opensource-src-4.5.0/mkspecs/qws/linux-arm-g++下的qmake.conf的文件如下
#
# qmake configuration for building with arm-linux-g++
#
include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC??????????????? = arm-none-linux-gnueabi-gcc
QMAKE_CXX?????????????? = arm-none-linux-gnueabi-g++
QMAKE_LINK????????????? = arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB??????? = arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR??????????????? = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY?????????? = arm-none-linux-gnueabi-objcopy
QMAKE_STRIP???????????? = arm-none-linux-gnueabi-strip
QMAKE_CFLAGS? ??? ??? ?+= -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
QMAKE_CXXFLAGS ?? ??? ?+= -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
load(qt_config)
?安裝目錄下的qmake.conf修改如下:因為不顯示修改的話,可能會導致在配置PC的qmake路徑時,提示找不到arm-none-linux-gnueabi-g++命令;如果沒有提示,這個不用修改也可以
/opt/EmbedSky/qt-4.5/__install/arm/mkspecs/qws/linux-arm-g++
?
#
# qmake configuration for building with arm-linux-g++
#
include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC??????????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-gcc
QMAKE_CXX?????????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK????????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB??????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR??????????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY?????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-objcopy
QMAKE_STRIP???????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-strip
QMAKE_CFLAGS? ??? ??? ?+= -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
QMAKE_CXXFLAGS ?? ??? ?+= -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
load(qt_config)
?
最后,對自己的程序不進行優化的話,可以修改/opt/EmbedSky/qt-4.5/__install/arm/mkspecs/common下的g++.conf中的QMAKE_CFLAGS_RELEASE?? ?+= -O2 為-O0;
總結
以上是生活随笔為你收集整理的关于qte illegal instruction的一些心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: illegal instruction错
- 下一篇: XP硬盘安装Ubuntu 10.10双系