在试图让qt5webkit包在iMX6设备上运行(Qt版本5.5.0来自2015.11 Buildroot发布版)时,我看到了代码生成的运行时断言。
它用输出来显示自己:
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包中的一个错误,我可能最终会提交一个补丁,但我不想这样做,直到我更好地理解它。
在环境方面,我们在Ubuntu14.04主机上使用Buildroot内部工具链。
发布于 2016-10-07 07:17:15
在中尝试以下目标选项:
https://stackoverflow.com/questions/39342254
复制相似问题