При попытке получить пакет qt5webkit
, запущенный на устройстве iMX6 (версия Qt 5.5.0
из версии 2015.11
Buildroot), я вижу утверждения во время выполнения, сгенерированные кодом.Возможные проблемы с пакетом Buildroot qt5webkit
Она проявляется с выходом:
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 будут ошибочными, если вы попытаетесь получить неуравновешенный доступ и даже более поздние, которые не ошибались, все равно продолжались медленнее.
Что я не понятно, почему стандартный код с распределением Buildroot не работает. Я довольно уверен, что проблема не в моем собственном коде, так как компиляция и запуск приложения-примера приложения (из пакета qt5webkit-examples
Buildroot) демонстрируют ту же проблему.
Утверждение явно находится в секции, которая только скомпилирована для ARM/MIPS под GCC/CLANG, поэтому она очень специфична для этих платформ. Это означает, что вполне возможно, что он никогда не тестировался должным образом.
В настоящем время, я добавил локальный патч в качестве временного решения, в частности, изменениях проверки, чтобы обеспечить выравнивание не имеет значения:
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, я, вероятно, в конечном итоге отправлю патч, но я не хочу этого делать, пока не пойму немного лучше.
С точки зрения окружающей среды, мы используем встроенную инструментальную цепочку Buildroot на ящике Ubuntu 14.04.
* "кто-то сумел получить 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. * «Я пропустил что-то ослепительно очевидное ...?» * - Вы никогда не упоминаете о своей среде и инструментальной цепочке; это может быть фактором. Я использую более старую gcc 4.8.3 toolchain, построенную с использованием crosstool-ng. – sawdust
@sawdust, среда-хост Ubuntu 14.04 и использует встроенную инструментальную цепочку Buildroot.Я уточню вопрос. – paxdiablo