【问题标题】:Possible problems with Buildroot qt5webkit packageBuildroot qt5webkit 包可能存在的问题
【发布时间】:2016-09-06 06:47:33
【问题描述】:

在尝试让qt5webkit 包在 iMX6 设备上运行(来自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 包在 ARM 芯片上作为 Buildroot 的一部分运行。我是否错过了一些对初学者来说非常明显的东西?如果确实是标准 Buildroot 包中的错误,我可能最终会提交一个补丁,但我不想这样做,直到我更好地理解它。

在环境方面,我们在 Ubuntu 14.04 主机上使用 Buildroot 内部工具链。

【问题讨论】:

  • “其他人已经设法让 qt5webkit 包在 ARM 芯片上作为 Buildroot 的一部分工作”——我有 Cortex-A5,使用 Buildroot 2014.08 用于 qt5webkit 5.3, Buildroot 2015.11.1 用于 qt5webkit 5.5.0,Buildroot 2016.05 用于 qt5webkit 5.5.1。 “我是否遗漏了一些非常明显的东西......?” -- 你从来没有提到你的主机环境和工具链;这些可能是促成因素。我正在使用使用 crosstool-ng 构建的较旧的 gcc 4.8.3 工具链。
  • @sawdust,主机环境是 Ubuntu 14.04,它使用 Buildroot 内部工具链。我会更新问题。

标签: qt5 assert qtwebkit memory-alignment buildroot


【解决方案1】:

在 buildroot menuconfig 中尝试以下目标选项:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多