关于qte illegal instruction的一些心得

  最近半个月在按照天嵌的TQ2440做qte方面的移植工作,去年刚拿到板子的时候用的是qt4.5的源码,那时还能顺利的移植到arm板上,可是最近也是按照天嵌手册来移植,当我编译一个qt测试程序,在arm板上一直提示: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的一些心得)