我现在已经在这个问题上挣扎了一个多星期了,仍然无法找到解决方案……

我正在尝试为ARM设备交叉编译Qt 4.7嵌入式开源版本.构建过程本身完成没有问题,但生成的二进制文件似乎包含处理器不理解的指令.

>在i386上构建主机是Debian 5(Etch)(在虚拟PC上运行)

>该设备是带有ARM处理器的Trimble Nomad手持设备(see full cpuinfo和kernel configuration)

>我使用为设备制作的原始构建工具链,并且到目前为止工作正常(甚至可以成功构建Gnash) – 请参阅compiler settings and version

>我正在使用基于linux-arm-gnueabi-g的自定义qmake.conf并适应使用正确的工具链 – see source code here

>我通过向编译器标志添加-msoft-float -D__GCC_FLOAT_NOT_NEEDED进行了部分改进,但在某些情况下仍然会出现“非法指令”错误(但至少这是一个很大的改进)

>二进制文件本身基本上可以工作,但在某些情况下,程序会因“非法指令”错误而崩溃.我相信这在某些浮点运算期间发生在进行图形处理时.

>添加-mcpu = xscale,-march = armv4,-O0,-march = armv4,-mtune = arm920t(并非所有在同一时间)都没有任何帮助.

>使用–debug标志构建Qt似乎可以解决所有问题,但添加-O2标志会重新引入它们.奇怪的是没有–debug的-O0设置没有帮助.

>可以看到编译器配置和输出输出here.有很多对齐警告但是they are said to be false warnings of the compiler.

> Qt 4.7.2肯定会有一些变化,因为早期版本(4.7.1,4.7.0)运行正常.

配置设置:

./configure \

-embedded arm \

-xplatform qws/linux-arm-angstrom-gnueabi-g++ \

-debug \

-no-largefile \

-no-multimedia \

-no-audio-backend \

-no-phonon \

-no-phonon-backend \

-webkit \

-javascript-jit \

-no-xshape \

-no-xvideo \

-no-xsync \

-no-xinerama \

-no-xcursor \

-no-xfixes \

-no-xrandr \

-no-xrender \

-no-xinput \

-no-xkb \

-no-opengl \

-nomake docs \

-nomake examples \

-nomake tools \

-nomake demos \

-nomake translations \

-opensource \

-qt-mouse-tslib \

-qt-libjpeg \

-qt-gif

坠机前的strace:

$LD_LIBRARY_PATH=. QT_QWS_FONTDIR=$PWD/fonts QT_PLUGIN_PATH=$PWD/plugins QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen0 strace ./digitalclock -qws test.htm

...

lseek(15, 0, SEEK_END) = 16998

write(15, "\t\n\f\0\367\t", 6) = 6

write(15, "\0\0+\234\325\343\306{\3\0\0\0\0J\370\377\351\301\336\377"..., 120) = 120

lseek(15, 0, SEEK_END) = 17124

write(15, "\10\10\10\0\371\10", 6) = 6

write(15, "\0\6j\251\260\201\27\0\2\276\377\351\334\377\346\32K\377"..., 64) = 64

lseek(15, 0, SEEK_END) = 17194

write(15, "\7\10\10\0\371\7", 6) = 6

write(15, "\0\4c\245\263\224 \0\1\271\377\367\315\356P\0I\377\364"..., 64) = 64

lseek(15, 0, SEEK_END) = 17264

write(15, "\10\n\10\1\366\10", 6) = 6

write(15, "\37 \3\0\0\0\0\0\374\377\34\0\0\0\0\0\374\377\34\0\0\0"..., 80) = 80

fcntl64(15, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0

lseek(15, 0, SEEK_END) = 17350

mremap(0x415f5000, 16552, 17350, MREMAP_MAYMOVE) = 0x415f5000

--- SIGILL (Illegal instruction) @ 0 (0) ---

rt_sigaction(SIGILL, {SIG_DFL}, {0x401b7d34, [ILL], SA_RESTART|0x4000000}, 8) = 0

socket_subcall(0x1f8004, 0, 0x100, 0, 0, 0x18844, 0x18840, 0x12c) = 0

ioctl(12, KDSKBMODE, 0x2) = 0

ioctl(12, SNDCTL_TMR_START or TCSETS, {B38400 -opost -isig -icanon -echo ...}) = 0

close(12) = 0

ioctl(10, KDSETMODE, 0x1) = 0

write(10, "\33[9;15]\33[?33h\33[?25h\33[?0c\0", 25) = 25

close(10) = 0

statfs64(umovestr: Input/output error

0x6d4f, 27983, {???}) = 0

sigreturn() = ? (mask now [ILL ABRT BUS FPE USR1 SEGV USR2 PIPE STKFLT CHLD CONT STOP TTOU URG XCPU VTALRM PROF WINCH IO PWR RTMIN])

--- SIGILL (Illegal instruction) @ 0 (0) ---

+++ killed by SIGILL +++

Process 27983 detached

崩溃的gdb回溯(由于使用调试信息进行编译,我缺少调试符号)解决了这个问题:

(gdb) run -qws

Starting program: /home/.qt-test2/digitalclock -qws

Program received signal SIGILL, Illegal instruction.

0x4130268c in __sigsetjmp () from /lib/libc.so.6

(gdb) bt

#0 0x4130268c in __sigsetjmp () from /lib/libc.so.6

#1 0x4046ee5c in ?? () from ./libQtGui.so.4

(gdb)

请注意,该设备预装了Qtopia 4.3,供应商也无法解释我的构建问题.

更新

在Igor Skochinsky的帮助下,我可以找到导致SIGILL的确切汇编指令.由于某种原因,指令在导致错误之前正常工作47次.请参阅下面的gdb输出(注意我根本不熟悉ARM汇编程序):

$LD_LIBRARY_PATH=. QT_QWS_FONTDIR=$PWD/fonts QT_PLUGIN_PATH=$PWD/plugins QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen0 gdb ./digitalclock

GNU gdb 6.6

Copyright (C) 2006 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for details.

This GDB was configured as "arm-angstrom-linux-gnueabi"...

Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) start -qws

Breakpoint 1 at 0xaa58: file main.cpp, line 47.

Starting program: /home/.qt-test2/digitalclock -qws

[Thread debugging using libthread_db enabled]

[New Thread 1073870720 (LWP 2799)]

[Switching to Thread 1073870720 (LWP 2799)]

main (argc=2, argv=0xbea17d04) at main.cpp:47

47 main.cpp: No such file or directory.

in main.cpp

(gdb) display/i $pc

1: x/i $pc 0xaa58 : sub r3, r11, #28 ; 0x1c

(gdb) display/x $r2

2: /x $r2 = 0xbea17d10

(gdb) display/x $f2

3: /x $f2 = 0x0

(gdb) b *0x41302684

Breakpoint 2 at 0x41302684

(gdb) continue

Continuing.

---> no problem here:

Breakpoint 2, 0x41302684 in __sigsetjmp () from /lib/libc.so.6

3: /x $f2 = 0x0

2: /x $r2 = 0x293

1: x/i $pc 0x41302684 <__sigsetjmp>: beq 0x413026a0

(gdb) si

0x41302688 in __sigsetjmp () from /lib/libc.so.6

3: /x $f2 = 0x0

2: /x $r2 = 0x293

1: x/i $pc 0x41302688 <__sigsetjmp>: stfp f2, [r12], #8

(gdb) si

0x4130268c in __sigsetjmp () from /lib/libc.so.6

3: /x $f2 = 0x0

2: /x $r2 = 0x293

1: x/i $pc 0x4130268c <__sigsetjmp>: stfp f3, [r12], #8

(gdb) si

0x41302690 in __sigsetjmp () from /lib/libc.so.6

3: /x $f2 = 0x0

2: /x $r2 = 0x293

1: x/i $pc 0x41302690 <__sigsetjmp>: stfp f4, [r12], #8

(gdb) continue

Continuing.

Breakpoint 2, 0x41302684 in __sigsetjmp () from /lib/libc.so.6

3: /x $f2 = 0x0

2: /x $r2 = 0x293

1: x/i $pc 0x41302684 <__sigsetjmp>: beq 0x413026a0

(gdb) continue 46

Will ignore next 45 crossings of breakpoint 2. Continuing.

---> __sigsetjmp still working fine, but then:

Breakpoint 2, 0x41302684 in __sigsetjmp () from /lib/libc.so.6

3: /x $f2 = 0x0

2: /x $r2 = 0x293

1: x/i $pc 0x41302684 <__sigsetjmp>: beq 0x413026a0

(gdb) si

0x41302688 in __sigsetjmp () from /lib/libc.so.6

3: /x $f2 = 0x0

2: /x $r2 = 0x293

1: x/i $pc 0x41302688 <__sigsetjmp>: stfp f2, [r12], #8

(gdb) si

Program received signal SIGILL, Illegal instruction.

0x4130268c in __sigsetjmp () from /lib/libc.so.6

3: /x $f2 = 0x0

2: /x $r2 = 0x293

1: x/i $pc 0x4130268c <__sigsetjmp>: stfp f3, [r12], #8

有什么建议我接下来可以尝试吗?

Linux 启动qt 非法指令,交叉编译Qt 4.7时的“非法指令”相关推荐

  1. 嵌入式Qt | 如何交叉编译Qt模块

    在硬件板卡提供商提供的嵌入式linux平台下的Qt环境中,很多时候会不太适合实际的开发场景: (1)可能一些Qt的模块不支持.这时候要么找厂家,要么自己编译. (2)在厂家提供的平台开发环境中,支持的 ...

  2. 怎么用命令启动服务器文件,linux启动服务器命令

    linux启动服务器命令 内容精选 换一换 安装Linux版的迁移Agent时,您输入AK/SK并启动迁移Agent后,提示"No such file or directory: 'rsyn ...

  3. 如何建立Qt Creator交叉编译嵌入式Linux

    如何建立Qt Creator交叉编译嵌入式Linux 介绍 Qt许可信息 Qt 5 安装Qt Creator 用于设备创建的Qt 构建和部署目标映像 构建用于开发的SDK 安装SDK 配置Qt Cre ...

  4. linux下 卸载qt_Windows 下 Qt creator安装和使用

    作者 |  思凡 常用C++开发环境介绍  命令行CommandLine   (1)Linux命令行:GNU g++ + Makefile/CMake   (2)Windows命令行:MinGW 市面 ...

  5. 在Linux下使用linuxdeployqt发布Qt程序

    一.简介 linuxdeployqt 是Linux下的qt打包工具,可以将应用程序使用的资源(如库,图形和插件)复制到二进制运行文件所在的文件夹中. 二.安装linuxdeployqt 去github ...

  6. linux+qt4.8画波形图,Qt画笔实现波形区域图

    参考文章:https://blog.csdn.net/yuxing55555/article/details/79752978 效果图: void WareArea::paintEvent(QPain ...

  7. 在Win10的Linux子系统Ubuntu中使用Qt

    在Win10的Linux子系统Ubuntu中使用Qt 陈拓 2021/07/26-2021/07/26 1. 概述 在<Win10的Linux子系统Ubuntu安装图形界面> https: ...

  8. linux qt编译器路径,QT学习之一:Linux下安装QT之版本qt

    在Linux中分别安装应用于不同平台的QT:PC:嵌入式X86:ARM. 这三者PC版.嵌入式X86版和ARM版的区别主要体现在:当configure时分别加了不同的参数,具体区别是:PC平台:在li ...

  9. QT笔记--嵌入式QT交叉编译与移植(含OpenGL ES2)

    介绍 本文记录了QT交叉编译并移植到开发板的过程,并在虚拟机上用QTcreater 开发程序,到开发板上运行.其中重点解决了一些过程中的BUG和坑. 准备工作 1.一个ubuntu系统的电脑(或虚拟机 ...

最新文章

  1. Py之cairocffi:cairocffi的简介、安装、使用方法之详细攻略
  2. axure类型app项目rp文件_Python编程快速上手实践项目--选择性拷贝指定类型文件到目的目录...
  3. EditText 空指针问题
  4. java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行
  5. 「经营分析报告」怎么做?这套模板让领导一看就懂
  6. 记一次尴尬的git reset丢失分支故障
  7. CVPR | BASNet:边缘感知的显著性物体检测
  8. 链接随机html,通过Javascript/HTML生成随机链接
  9. Ubuntu中Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend)问题的解决
  10. python ssh登录交换机_python使用paramiko模块通过ssh2协议对交换机进行配置的方法...
  11. 前端获取小程序二维码参数_微信小程序实现带参分享并消息卡片获取参数
  12. SVN使用过程中出现“工作副本已经锁定”的解决办法
  13. UIImageView的内容模式以及ImageNamed和imageWithContentsOfFile的区别
  14. 计算KL散度与JS散度的MATLAB程序
  15. 电信光猫破解 (打开无线wifi及路由功能)
  16. A40i使用笔记:使用QT调用aplay播放wav音频/混音
  17. URL中带特殊字符的处理方式
  18. py实战绘制人口金字塔图
  19. java基于HuTool工具类ExcelWriter合并单元格
  20. ABAP EWM HU打包

热门文章

  1. GCD最大公约数算法
  2. openmpi参数_openmpi
  3. Linux怎么卸载openmpi,openmpi安装
  4. 用HK-MSR165微型振动冲击记录仪记录动态机械应力,帮助优化机器、工件和生产
  5. C#制作高仿360安全卫士窗体二
  6. Qt之实现360安全卫士主界面(四)
  7. html中怎样设置缩进,html如何设置首行缩进
  8. QFrame类的使用
  9. loam 框架流程描述
  10. 教你重拾职场激情的妙计锦囊