For a dated embedded project I try to crosscompile Qt 4.7.4 on a current Ubuntu 16.04 x86_64 system with multiarch setup (amd64 + i386).
The crosscompilation was once set up for Ubuntu 12.04 x86, and it works well there. Compiling it on the new system for host debugging (host and target platform being set to x86/i386/32 bit) worked well, too. However, when I try to crosscompile it for the target system (arm) with the host set to i386 uic
segfaults while building the QtGui
lib.
The following relevant flags are used to configure Qt for the target system:
-host-arch i386 -platform qws/linux-x86-g++
-embedded arm -xplatform qws/linux-gnueabi-arm-mucross-g++
Furthermore mkspecs/qws/linux-x86-g++/qmake.conf
has been patched to include some compiler flags that seem necessary to get compilation and linking right:
QT_ARCH = I386
QMAKE_CFLAGS += -m32
QMAKE_CXXFLAGS += -m32
QMAKE_LFLAGS += -m32
This is the call that fails:
/<project>/qt-target/bin/uic /<project>/qt-everywhere-opensource-src-4.7.4/src/gui/dialogs/qpagesetupwidget.ui -o .uic/release-shared-emb-arm/ui_qpagesetupwidget.h
I can reproduce the segfault manually and debug it. strace
doesn't show anything obvious, the correct i386 libs are being loaded. Here's the first lines of the gdb
backtrace:
Program received signal SIGSEGV, Segmentation fault.
__GI___fesetenv (envp=0xffffbbd4) at ../sysdeps/i386/fpu/fesetenv.c:116
116 ../sysdeps/i386/fpu/fesetenv.c: Datei oder Verzeichnis nicht gefunden.
(gdb) backtrace
#0 __GI___fesetenv (envp=0xffffbbd4) at ../sysdeps/i386/fpu/fesetenv.c:116
#1 0x080fa7de in qdtoa (d=9999.9899999999998, mode=2, ndigits=6,
decpt=0xffffbce8, sign=0xffffbcec, rve=0xffffbcf4, resultp=0xffffbcf8)
at /<project>/qt-everywhere-opensource-src-4.7.4/src/corelib/tools/qlocale.cpp:6655
#2 0x080fc230 in QLocalePrivate::doubleToString (
this=0x8181160 <locale_data>, d=9999.9899999999998, precision=2,
form=<optimized out>, width=0, flags=<optimized out>)
at /<project>/qt-everywhere-opensource-src-4.7.4/src/corelib/tools/qlocale.cpp:4012
#3 0x0811da6f in QString::setNum (this=0xffffbf78, n=9999.9899999999998,
f=<optimized out>, prec=6)
at /<project>/qt-everywhere-opensource-src-4.7.4/src/corelib/tools/qstring.cpp:5930
#4 0x0811ddca in QString::number (n=9999.9899999999998, f=103 'g', prec=6)
at /<project>/qt-everywhere-opensource-src-4.7.4/src/corelib/tools/qstring.cpp:6034
Some investigation brought me to a glibc bug in fesetenv()
which was fixed in glibc 2.23, but since this is already installed (libc6 2.23-0ubuntu3), I didn't get any further here. The faulting line 116 has been introduced by that fix, but lacking knowledge of the internals I'm not able to point out the cause of the segfault:
__asm__ ("ldmxcsr %0" : : "m" (mxcsr));
Furthermore there are some old, closed or unresolved Qt bug reports regarding the bootstrap build (which includes uic
), but these didn't give me any useful hints either.
Who can give a pointer what I can try to find the cause and work around or fix this issue?
The reason for this problem was that additional, target specific include and lib dirs were provided to the configure
script using the -I
and -L
options. These were used for the bootstrap build, too, which didn't matter much on the old system where the headers of host and target where apparently close enough to each other.
Once moved into the target mkspec file and added to QMAKE_CFLAGS
, QMAKE_CXXFLAGS
and QMAKE_LFLAGS
the build process works fine.