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