Buildroot qt5webkit 包可能出现的问题

Possible problems with Buildroot qt5webkit package

在尝试在 iMX6 设备上获取 qt5webkit 包 运行ning(来自 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)

执行断言检查的代码如下,您可以看到它实际上是在检查对齐以确保它没问题:

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 芯片会出错,甚至后来的芯片没有出错,仍然 运行 更慢。

清楚地理解为什么 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 包作为 Buildroot 的一部分在 ARM 芯片上运行。我是否遗漏了一些对新手来说非常明显的东西?如果确实是标准 Buildroot 包中的错误,我可能最终会提交一个补丁,但在我更好地理解它之前我不想这样做。

就环境而言,我们在 Ubuntu 14.04 主机箱上使用 Buildroot 内部工具链。

在 buildroot 菜单配置中尝试以下目标选项:

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