关于illegalinstruction

来源:互联网 发布:windows 文件夹 密码 编辑:程序博客网 时间:2024/06/04 20:27
最近半个月在按照天嵌的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;

原创粉丝点击