试图在iMX6设备上运行qt5webkit
包(从2015.11
Buildroot发布的Qt版本5.5.0
),我看到代码生成的运行时断言。
它表现为输出:
ASSERTION FAILED:
isPointerTypeAlignmentOkay(reinterpret_cast<TypePtr>(ptr))
../WTF/wtf/StdLibExtras.h(102):
TypePtr reinterpret_cast_ptr(const void*)
[with TypePtr = const unsigned int*]
Segmentation fault (core dumped)
下面是执行assert检查的代码,你可以看到它实际上是在检查对齐以确保它是正确的:
template<typename Type> bool isPointerTypeAlignmentOkay(Type* ptr)
{
return !(reinterpret_cast<intptr_t>(ptr) % __alignof__(Type));
}
template<typename TypePtr> TypePtr reinterpret_cast_ptr(const void* ptr)
{
ASSERT(isPointerTypeAlignmentOkay(reinterpret_cast<TypePtr>(ptr)));
return reinterpret_cast<TypePtr>(ptr);
}
现在我明白为什么这样做了。从内存(不可否认已经褪色)来看,早期的ARM芯片如果尝试不对齐访问会出错,即使后来没有出错的ARM芯片运行起来也会更慢。
我不清楚的是为什么Buildroot发行版的标准代码会失败。我很确定这个问题不是在我自己的代码中,因为编译和运行示例浏览器应用程序(从qt5webkit-examples
Buildroot包)显示了同样的问题。
断言显然是在一个只针对GCC/CLANG下的ARM/MIPS编译的部分中,所以它是非常特定于这些平台的。这意味着它完全有可能从未经过适当的测试。
现在,我已经添加了一个本地补丁作为解决方案,特别是更改检查以确保对齐无关:
diff --git a/Source/WTF/wtf/StdLibExtras.h b/Source/WTF/wtf/StdLibExtras.h
--- a/Source/WTF/wtf/StdLibExtras.h 2000-01-01 00:00:00.000000000 +0000
+++ b/Source/WTF/wtf/StdLibExtras.h 2000-01-01 00:00:00.000000000 +0000
@@ -86,5 +86,5 @@
template<typename Type>
bool isPointerTypeAlignmentOkay(Type* ptr)
{
- return !(reinterpret_cast<intptr_t>(ptr) % __alignof__(Type));
+ return true;
}
然而,我对此有一些担忧。首先,这在ARM芯片(特别是目前的Cortex-A9变体)上是否安全。它似乎运行正常,但我不确定是否有微妙的边缘情况,我应该关注。我还不担心它可能会运行得慢,特别是如果另一种选择是它根本不运行。
第二个问题是简单地问是否有人已经设法让qt5webkit
包在ARM芯片上作为Buildroot的一部分工作。我是不是错过了什么对新手来说显而易见的东西?如果它确实是标准Buildroot包中的一个错误,我可能最终会提交一个补丁,但我不想这样做,直到我更好地理解它。
在环境方面,我们在Ubuntu 14.04主机上使用builroot -internal工具链。
在buildroot菜单配置中尝试以下目标选项:
- 选择启用NEON SIMD扩展支持
- 设置浮点策略为VFPv3-D16