При сборке пакета libt1ha-2.0.1-alt2 для armh обнаруживается макрос gcc __ARM_FEATURE_UNALIGNED и начинает использоваться код, допускающий невыравненный доступ к памяти. В результате этого в тесте прилетает SIGBUS несмотря на то, что gcc сообщил посредством макроса __ARM_FEATURE_UNALIGNED о том, что такой доступ к памяти к проблемам приводить не должен. Поскольку на всём доступном мне тестовом железе, а также на сборочнице, результат одинаковый - SIGBUS - я считаю что gcc не должен по-умолчанию выставлять макрос __ARM_FEATURE_UNALIGNED. На aarch64 макрос тоже выставляется, но SIGBUS не прилетает, т.е. с невыравненным доступом к памяти проблем не обнаружено. Воспроизведение: gcc -dM -E - < /dev/null | grep __ARM_FEATURE_UNALIGNED Ожидаемый результат: Пустой вывод на armh Результат: #define __ARM_FEATURE_UNALIGNED 1 Также можно протестировать пересборкой пакета libt1ha версии 2.0.1-alt2 для armh. Если проблема исправлена, он должен пересобираться без проблем, включая запуск тестов. Более новые версии данного пакета могут не подойти поскольку планирую сделать workaround. В gcc-7 и gcc-8 на armh макрос также определён.
Начиная с armv6 unaligned access поддерживается (с известными ограничениями), см. https://www.keil.com/support/man/docs/armasm/armasm_dom1359731171041.htm У нас поддерживается armv7a и новее. А поэтому > gcc -dM -E - < /dev/null | grep __ARM_FEATURE_UNALIGNED > Результат: > #define __ARM_FEATURE_UNALIGNED 1 результат ожидаемый и правильный.
Я не думаю, что получаемый при этом SIGBUS - результат ожидаемый и правильный.
(In reply to Aleksei Nikiforov from comment #2) > Я не думаю, что получаемый при этом SIGBUS - результат ожидаемый и > правильный. Из приведенных Вами данных никак не следует, что ошибка вызвана именно компилятором, а не кодом, который Вы собираете. > gcc не должен по-умолчанию выставлять макрос __ARM_FEATURE_UNALIGNED То есть все процессоры будут притворяться armv5, чтобы libfoo нормально собралась. Нет, спасибо.
https://github.com/erthink/t1ha/issues/45
(Ответ для Alexey Sheplyakov на комментарий #4) > https://github.com/erthink/t1ha/issues/45 https://git.altlinux.org/gears/l/libt1ha.git?p=libt1ha.git;a=commitdiff;h=b59561ef13ff75caf38d6ab16315f8a3c8e93513 Предложенное исправление делает примерно то же самое, что сделал уже я при сборке t1ha: отключает unaligned access на armh. Раз уж и апстрим предлагает подобное решение, предлагаю баг закрыть.
Автор t1ha предположил, что 1) из __ARM_FEATURE_UNALIGNED следует, что возможно чтение 64-битного значения по адресу, не кратному 8 байт. 2) что такое чтение эффективно. На самом же деле оба предположения НЕВЕРНЫ. __ARM_FEATURE_UNALIGNED_ACCESS означает, что можно читать/писать 32-х (16-ти) битные значения по адресу, не кратному 4-м (2-с) байтам. По поводу эффективности ничего не гарантируется (гарантируется только, что такое чтение/запись не вызовут исключения).