April 8, 2011

jampy81 jampy81
Lab Rat
5 posts

“Illegal instruction” when cross-compiling Qt 4.7.2+

 

I’m trying to cross compile Qt embedded 4.7 for a Linux ARM device (Trimble Nomad) for a few days. While it was pretty easy to get a successful build I had the problem that running the binaries on the device lead to “Invalid instruction” errors with some (but not all!) demos. It helped a lot to add -msoft-float -D__GCC_FLOAT_NOT_NEEDED
to the compiler flags in qmake.conf but the “Invalid instruction” still appeared with some examples.

Strangely, when building Qt with the -debug flag everything is fine and I don’t get any problems anymore, even if I “strip” the binaries. All Qt programs are running fine.

So I guess that the option does more than add some debug symbols in the binaries. Can anybody explain me how it affects the build?

I could live with -debug on, but I need to avoid any potentially negative impact on performance.

Full configure settings below (i386; Debian Lenny Host):

./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 \ -opensource \ -qt-mouse-tslib \ -qt-libjpeg \ -qt-gif

My qmake.conf can be seen here: http://pastebin.com/D3RECiUj

4 replies

April 8, 2011

ZapB ZapB
Hobby Entomologist
1423 posts

With -release the code is compiled with (typically) the -O2 option passed to the compiler command line. The gcc docs will tell you exactly which optimisations this allows the compiler to apply. Without checking I think it implies things like limited loop unrolling, inlining of functions, some instruction reordering.

It is more likely that the -march, -mtune, or -mcpu options in the mkspec are not quite right for your cpu or that your cross-toolchain is broken in some way. Are you able to build and run optimised code without Qt using your cross-toolchain?

 Signature 

Nokia Certified Qt Specialist
Interested in hearing about Qt related work

April 9, 2011

jampy81 jampy81
Lab Rat
5 posts
ZapB wrote:
With -release the code is compiled with (typically) the -O2 option passed to the compiler command line.

You’re right, adding the -O2 flag reintroduces the “Illegal instruction” error. Strangely, using -O0 in -release mode does not avoid the error, so -debug must do some more changes.

ZapB wrote:
It is more likely that the -march, -mtune, or -mcpu options in the mkspec are not quite right for your cpu or that your cross-toolchain is broken in some way.

I tried -mcpu=xscale, -march=armv4, -mtune=arm920t (and non-conflicting combinations) but it didn’t change anything. As said, only “-msoft-float” helped so far.
Perhaps you have some concrete suggestions for compiler settings I should try? You can see the cpuinfo here: http://pastebin.com/NS5CyEpQ
Compiler version and settings: http://pastebin.com/jbEjYMwT

ZapB wrote:
Are you able to build and run optimised code without Qt using your cross-toolchain?

I’m using the toolchain for quite a while now without problems. Even Gnash (the OS flash player written in C++) had never any problems with -O2, although it had been built on a different host (but identical toolchain). The toolchain was made by the hardware vendor and they say that they had no problems building Qtopia 4.3. I usually don’t need to specify any special compiler settings.

Any suggestions?

April 9, 2011

peppe peppe
Ant Farmer
1026 posts

Difficult to say who is to blame here.

It may be a Qt bug (trying to utilize certain ARM intrisics on a unsupported CPU), or a toolchain problem. You should try to build a minimal testcase that shows the problem, then it would be quite easy to check where it is coming from.

 Signature 

Software Engineer
KDAB (UK) Ltd., a KDAB Group company

April 19, 2011

jampy81 jampy81
Lab Rat
5 posts

I am not able to build a minimal testcase since I don’t know what the problem is. I tried with floating point operations but they all run fine. I just know that at least the little example program “digitalclock” from the Qt source fails every time with Qt 4.7.2+.

It think the problem must be in some Qt optimizations that do not work with my CPU. I do not have any problems with Qt 4.7.0 or 4.7.1 but I get the same identical errors in Qt 4.7.2 and 4.7.3, so obviously it is related to some change between 4.7.1 and 4.7.2.

Looking at the diff of src/gui/painting/qdrawhelper.cpp I can see QT_HAVE_NEON checks all over the place. What is this? Also there are other ARM- and MMX-related changes to that file. Could one of them be the cause of my problem?
See full diff between 4.7.1 and 4.7.2 here:
http://indunet.it/temp/qt7-problem/qdrawhelper-471-472-diff.htm or
http://indunet.it/temp/qt7-problem/qdrawhelper-471-472-diff.patch

Unfortunately I am not so familiar whether with ARM assembly nor with the Qt defines.

I would be glad if you could give me some hint..

PS: There is also a discussion at Stackoverflow with lots of details to my problem: http://stackoverflow.com/questions/5621393/illegal-instruction-when-cross-compiling-qt-4-7

 
  ‹‹ N8 fingerprint match      Qt Send SMS saves message in drafts ››

You must log in to post a reply. Not a member yet? Register here!