为ARM-EABI编译Linux内核,但是使用4字节大型对齐?

时间:2012-06-24 13:21:50

标签: gcc linux-kernel arm eabi

默认情况下,任何大型(大于4个字节)都将与EABI上的8个字节对齐。这意味着,如果调用function(u32, u64),则u32进入r0,并且u64在r2r3之间分开,而r1未使用。

如何让编译器在4字节上对齐?我理解这种情况的后果(打破ABI)或其他什么,但我并不在乎。不建议使用OABI,因为在内核配置中启用OABI会禁用对ARMv7的支持。

对于4字节对齐方式,u32仍会进入r0,但u64现在将分为r1r2

2 个答案:

答案 0 :(得分:3)

我希望正确的方法是使用修改后的EABI定义重新编译工具链,您可能会从您不想使用的OABI中获得部分限制。

您可能还必须重新编写内核的某些汇编语言部分,因此如果您为修改后的ABI指定了新名称可能会更好。

期望花费相当多的时间来理解和修复它破坏的各种事物。

答案 1 :(得分:0)

GCC具有aligned属性,可以应用于类型:

typedef long __attribute__((aligned(4))) unaligned_long;

现在,您可以(小心)使用此类型。