Bug 38995 - gcc на armh сообщает о поддержке невыравненного доступа к памяти, использование которого приводит к SIGBUS
Summary: gcc на armh сообщает о поддержке невыравненного доступа к памяти, использован...
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: gcc9 (show other bugs)
Version: unstable
Hardware: arm Linux
: P5 normal
Assignee: Gleb F-Malinovskiy
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-09-25 17:04 MSK by Aleksei Nikiforov
Modified: 2022-01-26 17:37 MSK (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Aleksei Nikiforov 2020-09-25 17:04:59 MSK
При сборке пакета 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 макрос также определён.
Comment 1 Alexey Sheplyakov 2022-01-25 14:19:19 MSK
Начиная с 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

результат ожидаемый и правильный.
Comment 2 Aleksei Nikiforov 2022-01-25 14:26:23 MSK
Я не думаю, что получаемый при этом SIGBUS - результат ожидаемый и правильный.
Comment 3 Alexey Sheplyakov 2022-01-25 18:40:12 MSK
(In reply to Aleksei Nikiforov from comment #2)

> Я не думаю, что получаемый при этом SIGBUS - результат ожидаемый и
> правильный.

Из приведенных Вами данных никак не следует, что ошибка вызвана именно компилятором, а не кодом, который Вы собираете.

> gcc не должен по-умолчанию выставлять макрос __ARM_FEATURE_UNALIGNED

То есть все процессоры будут притворяться armv5, чтобы libfoo нормально собралась. Нет, спасибо.
Comment 4 Alexey Sheplyakov 2022-01-25 19:16:03 MSK
https://github.com/erthink/t1ha/issues/45
Comment 5 Aleksei Nikiforov 2022-01-26 10:15:17 MSK
(Ответ для 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. Раз уж и апстрим предлагает подобное решение, предлагаю баг закрыть.
Comment 6 Alexey Sheplyakov 2022-01-26 17:37:04 MSK
Автор t1ha предположил, что 
1) из __ARM_FEATURE_UNALIGNED следует, что возможно чтение 64-битного значения по адресу, не кратному 8 байт. 
2) что такое чтение эффективно.

На самом же деле оба предположения НЕВЕРНЫ. __ARM_FEATURE_UNALIGNED_ACCESS означает, что можно читать/писать 32-х (16-ти) битные значения по адресу, не кратному 4-м (2-с) байтам. По поводу эффективности ничего не гарантируется (гарантируется только, что такое чтение/запись не вызовут исключения).