最近半个月在按照天嵌的TQ2440做qte方面的移植工作,去年刚拿到板子的时候用的是qt4.5的源码,那时还能顺利的移植到arm板上,可是最近也是按照天嵌手册来移植,当我编译一个qt测试程序,在arm板上一直提示:illegalinstruction的错误;一下回顾记录一下这几天所收集到的一些资料
程序出现illegalinstruction的原因是因为我们的进程在运行的过程中收到了SIGILL信号,而这个信号是由cpu在发现一个非法指令之后发出一个异常,然后有负责处理该异常的ISR(中断服务程序)对包含有这个非法指令的进程发出的,我们的进程在收到这个信号之后,一般就会报告一个illegalinstruction的错误信息。
可执行程序含有非法指令的原因,一般就是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 compilerswitches do I need to build working code on a mini2440?
If you'restaring at "illegal instruction error" problems, and usingarm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2008q3-72) 4.3.2, youneed this:
-msoft-float-D__GCC_FLOAT_NOT_NEEDED -march=armv4-mtune=arm920t
看来在我们编译qt程序时,需要显示的指定这些参数,但是,问题还是没解决啊,在哪个文件中添加这些选项呢?
附录:
我制定-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 witharm-linux-g++
#
include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC =/home/csb/arm-linux/4.3.3/bin/arm-none-linux-gnueabi-gcc
QMAKE_CXX =/home/csb/arm-linux/4.3.3/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK =/home/csb/arm-linux/4.3.3/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB =/home/csb/arm-linux/4.3.3/bin/arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR =/home/csb/arm-linux/4.3.3/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY =/home/csb/arm-linux/4.3.3/bin/arm-none-linux-gnueabi-objcopy
QMAKE_STRIP =/home/csb/arm-linux/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;