GCC: (GNU) 4.9.x-google 20140827 (prerelease). Проблема с alignment (address sanitize)? Доброго времени суток всем. Поясните пожалуйста следующую вещь про выравнивание и другие особенности в различных версиях GCC 4.7, 4.8, 4.9.x с различными clang. Опишу проблему упрощенно, есть проект, скажем это Unix-based ОС собранная из исходников с помощью GCC: (GNU) 4.9.x-google 20140827 (prerelease) clang version 3.6. Т.е. все бинарники ОС собраны с помощью одной и той же указанной версии компилятора. ОС использует "сторонние бинарники", например, отдельную библиотеку обработки видео и т.п. Для простоты примера будем полагать что это libvideo.so , которые есть разных версий. Так вот, заметил следующую особенность, не все версии libvideo.so собранные разными компиляторами для этой ОС корректно работают.
Например:1. libvideo.so - (GNU) 4.6.x-google 20120106 (prerelease) - работает.2. libvideo.so - GCC: (GNU) 4.7 - работает.3. libvideo.so - GCC: (GNU) 4.8 - работает.4. libvideo.so - GCC: (GNU) 4.9.x-google 20140827 (prerelease) clang version 3.6 - не работает. Crash'ится в libc.
При этом естественно подразумевается, что разрядность, платформа для которой собраны libvideo.so совпадают. В последнем случае вроде бы библиотека собрана тем же компилятором что и ОС, но как раз она и не работает, крашась где-то в недрах libc.so. Читал что начиная с определенной версии GCC (или clang) есть поддержка некого "aligment support", которое может быть причиной. Кто-нибудь может объяснить чуть более подробно, что кардинально изменилось с alignment в версии GCC 4.9.x и почему бинарники собранные различными версиями GCC могут оказаться "несовместимыми"? Опытным путем было установлено, что все версии libvideo.so собранные GCC до 4.8 гарантированно работают. А вот после - зависит от версии компилятора и каких-то других пока непонятных мне факторов.
Что такого кардинального поменялось в GCC после 4.8, что может приводить к такому поведению? (да, библиотека libvideo.so сторонняя, т.е. поставляется в виде бинарников, собрать ее из исходников возможности нет).

21 Авг 2019 в 06:33
198 +1
0
Ответы
1

Проблема с выравниванием (alignment) может быть связана с изменениями в компиляторе GCC после версии 4.8. Одним из основных изменений, которые могли повлиять на работу бинарных файлов, собранных различными версиями GCC, может быть изменение в поддержке выравнивания данных.

Выравнивание данных в компьютерной архитектуре играет важную роль при доступе к памяти. Некоторые процессоры требуют, чтобы данные были выровнены по определенным границам (например, 4 байта для данных типа int, 8 байт для данных типа double и т.д.). Если данные не выровнены правильно, это может привести к некорректной работе программы, вылету из программы или другим проблемам.

Изменения в поддержке выравнивания данных в GCC могут привести к тому, что бинарные файлы, собранные разными версиями компилятора, становятся несовместимыми. Это может быть особенно заметно при использовании сторонних бинарных файлов, таких как ваш libvideo.so.

Если вы столкнулись с проблемой несовместимости бинарных файлов, собранных разными версиями GCC после версии 4.8, рекомендуется обратиться к документации GCC и официальным релизным заметкам по каждой версии компилятора, чтобы понять, какие изменения влияют на выравнивание данных.

Также возможно, что для решения проблемы вам придется обновить библиотеку libvideo.so до совместимой версии или найти другие способы обойти проблему с помощью настройки компилятора или других методов.

20 Апр в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир