Поиск
Показаны результаты для тегов 'no-relax'.
-
Всем привет! Обнаружилась одна очень неприятная ошибка в поведении линкера для microblaze (mb-ld), по крайней мере для Vivado 2019.2 (на других еще не проверял). Выражается она в неправильном вычислении линкером смещений упакованных структур, содержащихся внутри не упакованных. Так это проявилось у меня. При этом изменение порядка полей в структуре (сначала неупакованные данные, потом упакованные структуры) на первый взгляд убирает проблему, но пока гарантий нет никаких.Эта ошибка достаточно коварна, т.к. на её появление влияет также порядок вызова функций в программе. В моём случае добавления в начало main() вызова функции, использующего эти данные, устраняет ошибку обращения конкретно к этой структуре. Судя по наблюдаемому поведению линкера, проблема заключается в удалении из результирующего ELF "ненужных" команд imm 0, но без последующей коррекции смещений. Нашел сходный баг, которому уже 10 лет и он по-прежнему без движения. В нем описывается данное поведение только для исходников на ассемблере, но в моем случае то же самое наблюдается и для исходников на C/C++. Слева результат objdump после компиляции с --no-relax, справа с опцией --relax: Как видно, была удалена та самая команда imm 0. Поскольку при использовании для линковки mb-gcc опция --relax включена по-умолчанию, то такое поведение может внезапно выйти боком в самый неожиданный момент. Минус отключения relax - возрастание размера прошивки, но по-моему обычно стабильность важнее. Тем более что проверить, что именно ваш проект не подвержен этой ошибке можно только длительным тестированием и то гарантии в результате дать практически невозможно. Кто-нибудь еще сталкивался с подобной проблемой? Может быть я что-то упускаю и есть другой путь обхода этой проблемы?
- 18 ответов
-
- mb-gcc
- microblaze
-
(и ещё 4 )
C тегом: