默认情况下,任何大型类型(大于4个字节)在EABI上都将对齐为8个字节。这意味着如果调用function(u32, u64)
,u32进入r0
,u64在r2
和r3
之间分配,r1
未使用。
如何使编译器将其对齐为 4 个字节?我理解这样做的后果(打破 ABI)或其他什么,但我并不在乎。也不建议使用 OABI,因为在内核配置中启用 OABI 会禁用对 ARMv7 的支持。
使用 4 字节对齐,u32 仍将进入r0
但 u64 现在将在 r1
和 r2
之间拆分。
方法是使用修改后的EABI定义重新编译工具链,您可能会部分从您不想使用的OABI中获取。
您可能还需要重写内核的某些汇编语言部分,因此最好为修改后的 ABI 指定一个新名称。
希望花相当多的时间了解和修复它破坏的各种事情。
GCC 具有 aligned
属性,可以应用于类型:
typedef long __attribute__((aligned(4))) unaligned_long;
现在,您可以在需要时(小心)使用此类型。