Buildroot qt5webkit包可能存在的问题



试图在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菜单配置中尝试以下目标选项:

  1. 选择启用NEON SIMD扩展支持
  2. 设置浮点策略为VFPv3-D16

相关内容

  • 没有找到相关文章

最新更新