交叉编译 Qt4:uic 段错误
Crosscompiling Qt4: uic segfaults
对于一个过时的嵌入式项目,我尝试在当前的 Ubuntu 16.04 x86_64 系统上交叉编译 Qt 4.7.4 与多架构设置(amd64 + i386 ).
曾经为 Ubuntu 12.04 x86 设置交叉编译,并且在那里运行良好。在用于主机调试的新系统上编译它(主机和目标平台设置为 x86/i386/32 位)也运行良好。但是,当我尝试在构建 QtGui
lib.
时将主机设置为 i386 uic
segfaults 的目标系统(arm)交叉编译它时
以下相关标志用于为目标系统配置Qt:
-host-arch i386 -platform qws/linux-x86-g++
-embedded arm -xplatform qws/linux-gnueabi-arm-mucross-g++
此外 mkspecs/qws/linux-x86-g++/qmake.conf
已修补以包含一些编译器标志,这些标志似乎是正确编译和链接所必需的:
QT_ARCH = I386
QMAKE_CFLAGS += -m32
QMAKE_CXXFLAGS += -m32
QMAKE_LFLAGS += -m32
这是失败的调用:
/<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
我可以手动重现段错误并进行调试。 strace
没有显示任何明显的内容,正在加载正确的 i386 库。这是 gdb
回溯的第一行:
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
一些调查将我带到 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,但由于缺乏内部知识,我无法指出段错误的原因:
__asm__ ("ldmxcsr %0" : : "m" (mxcsr));
此外,关于 bootstrap 构建(包括 uic
),还有一些旧的、已关闭或未解决的 Qt bug reports,但这些也没有给我任何有用的提示。
谁能指点一下我可以尝试找出原因并解决或修复此问题?
此问题的原因是使用 -I
和 -L
选项向 configure
脚本提供了额外的、特定于目标的包含和库目录。这些也用于 bootstrap 构建,这在主机和目标的 headers 显然彼此足够接近的旧系统上无关紧要。
一旦移动到目标 mkspec 文件并添加到 QMAKE_CFLAGS
、QMAKE_CXXFLAGS
和 QMAKE_LFLAGS
,构建过程就可以正常工作。
对于一个过时的嵌入式项目,我尝试在当前的 Ubuntu 16.04 x86_64 系统上交叉编译 Qt 4.7.4 与多架构设置(amd64 + i386 ).
曾经为 Ubuntu 12.04 x86 设置交叉编译,并且在那里运行良好。在用于主机调试的新系统上编译它(主机和目标平台设置为 x86/i386/32 位)也运行良好。但是,当我尝试在构建 QtGui
lib.
uic
segfaults 的目标系统(arm)交叉编译它时
以下相关标志用于为目标系统配置Qt:
-host-arch i386 -platform qws/linux-x86-g++
-embedded arm -xplatform qws/linux-gnueabi-arm-mucross-g++
此外 mkspecs/qws/linux-x86-g++/qmake.conf
已修补以包含一些编译器标志,这些标志似乎是正确编译和链接所必需的:
QT_ARCH = I386
QMAKE_CFLAGS += -m32
QMAKE_CXXFLAGS += -m32
QMAKE_LFLAGS += -m32
这是失败的调用:
/<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
我可以手动重现段错误并进行调试。 strace
没有显示任何明显的内容,正在加载正确的 i386 库。这是 gdb
回溯的第一行:
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
一些调查将我带到 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,但由于缺乏内部知识,我无法指出段错误的原因:
__asm__ ("ldmxcsr %0" : : "m" (mxcsr));
此外,关于 bootstrap 构建(包括 uic
),还有一些旧的、已关闭或未解决的 Qt bug reports,但这些也没有给我任何有用的提示。
谁能指点一下我可以尝试找出原因并解决或修复此问题?
此问题的原因是使用 -I
和 -L
选项向 configure
脚本提供了额外的、特定于目标的包含和库目录。这些也用于 bootstrap 构建,这在主机和目标的 headers 显然彼此足够接近的旧系统上无关紧要。
一旦移动到目标 mkspec 文件并添加到 QMAKE_CFLAGS
、QMAKE_CXXFLAGS
和 QMAKE_LFLAGS
,构建过程就可以正常工作。