Не думаю, что сбой вызван длиной кодировки инструкций. Режимы ARM и Thumb должны иметь одинаковую способность загружать данные с выровненных или невыровненных адресов.
Во-первых, используете ли вы реальное оборудование ARMv5, которое действительно не допускает выравнивания 32-битных нагрузок? Потому что более новые чипы ARM, например, чипы ARMv6 ( ARM11 ), работающие под управлением Android, скомпилированные для ARMv5TE, могут выполнять 32-разрядные загрузки без выравнивания и не дают сбоя. Конечно, если ваш манифест утверждает, что он скомпилирован для ARMv5TE, тогда устройство Android, работающее на реальном оборудовании ARMv5, с радостью установит его и выйдет из строя - вы должны убедиться, что ваше приложение действительно совместимо с тем, что оно заявляет.
Qemu (включая эмулятор, включенный в Android SDK) не правильно эмулирует сбой при невыровненных 32-битных нагрузках, когда он эмулирует чип arm926ej-s (ARMv5TEJ). Вы не можете полагаться на эмулятор, чтобы поймать это. В этом отношении это действительно хорошо только для разработки на Java.
Можете ли вы увидеть сбой в GDB? Можете ли вы показать дамп регистра и увидеть загрузку с ненастроенного адреса? Вы уверены, что компилятор не меняет смысл вашего кода (допустимым образом)?
Для переносимости после x86, вы действительно не должны выполнять приведение от uint16_t*
до uint32_t*
. Язык C не гарантирует, что они будут работать. Технически ваш код всегда был «неправильным». Посмотрите на переносимый код в дикой природе: он использует макросы препроцессора или статические встроенные функции для абстрагирования от таких понятий, как «get_unaligned_le32» или целых функций, которые в x86 полагаются на доступ без выравнивания.