Иван Денисов писал(а):
Воспользовался приемом, который придумал kekc_leader и в Linux теперь текстуры для вывода шрифтов генерирую так!
Очень рад, что моя находка пригодилась.
Кстати, статья на Хабре ведь не о выравнивании начального адреса части стека при вызове процедуры (которое производится иногда по 4, а иногда - по 16 байт), а о выравнивании элементов внутри записи. Или с этим тоже возникают проблемы несовместимости в случае работы со шрифтами?
Насчёт включения такого выравнивания в линуксовскую версию ядра Блэкбокса. Возможно, я не знаю всех подробностей, но пока что склоняюсь к тому, что линуксовский Блэкбокс всегда должен выравнивать стековые блоки при вызовах процедур по 16 байт. Потому что:
1) Когда мы пишем программу, используя какую-нибудь стороннюю библиотеку, то сталкиваемся с тем, что в документации к библиотекам как правило не указываются особенности отдельных экспортируемых процедур, связанные с выравниванием начальных адресов. Например в документации к SDL2 нигде не указано про такую особенность процедуры SDL_FillRect, а также некоторых других процедур.
2) При попытке экспериментальным путём установить, какие из процедур нуждаются в особом выравнивании, мы сталкиваемся с необходимостью тестировать каждую процедуру отдельно, а также, что более существенно, с тем, что какая-либо процедура может при определённых обстоятельствах не требовать особого выравнивания, а при других - требовать. Например, в SDL2 это зависит от режима, в котором был создан прорисовщик (SDL_Renderer): аппаратный режим или программный. Программный режим использует особые инструкции процессора, для которых и необходимо выравнивание. С другой стороны, требования той или иной процедуры могут зависеть не только от программного контекста, но и от марки процессора, на которой происходит работа программы. Таким образом, нормально разрабатывать на линуксовской версии Блэкбокса программы, использующие сторонние библиотеки,
принципиально не представляется возможным. Имеется в виду разработка программ в обероновском смысле, настоящая разработка, с возможностью верификации, а не механической проверки на всех возможных компьютерах, "работает или нет".
3) Проблема, изложенная в пункте №2, в GCC на Линуксе (начиная с определённой версии, с которой сама проблема и возникает) решается следующим образом: отрезок стека для
любой процедуры выравнивается по 16 байт. На Линуксе практически все сторонние библиотеки компилируются с помощью GCC, а значит Блэкбокс (в своей версии для Линукса) должен быть совместим библиотеками, скомпилированными на GCC, то есть должен использовать такое выравнивание для всех процедур.
Надеюсь, что сумел убедить если не в необходимости изложенного решения, то в степени существенности данной неисправности как таковой.