Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. "Illegal instruction" when cross-compiling Qt 4.7.2+

"Illegal instruction" when cross-compiling Qt 4.7.2+

Scheduled Pinned Locked Moved Mobile and Embedded
5 Posts 3 Posters 6.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    jampy81
    wrote on last edited by
    #1

    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

    1 Reply Last reply
    0
    • Z Offline
      Z Offline
      ZapB
      wrote on last edited by
      #2

      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?

      Nokia Certified Qt Specialist
      Interested in hearing about Qt related work

      1 Reply Last reply
      0
      • J Offline
        J Offline
        jampy81
        wrote on last edited by
        #3

        [quote author="ZapB" date="1302290525"]With -release the code is compiled with (typically) the -O2 option passed to the compiler command line. [/quote]

        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.

        [quote author="ZapB" date="1302290525"]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. [/quote]

        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

        [quote author="ZapB" date="1302290525"]Are you able to build and run optimised code without Qt using your cross-toolchain?[/quote]

        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?

        1 Reply Last reply
        0
        • D Offline
          D Offline
          dangelog
          wrote on last edited by
          #4

          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.

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

          1 Reply Last reply
          0
          • J Offline
            J Offline
            jampy81
            wrote on last edited by
            #5

            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

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved