【发布时间】: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