为 ARM-EABI 编译 Linux 内核,但采用 4 字节大类型对齐



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

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

使用 4 字节对齐,u32 仍将进入r0但 u64 现在将在 r1r2 之间拆分。

我希望正确的

方法是使用修改后的EABI定义重新编译工具链,您可能会部分从您不想使用的OABI中获取。

您可能还需要重写内核的某些汇编语言部分,因此最好为修改后的 ABI 指定一个新名称。

希望花相当多的时间了解和修复它破坏的各种事情。

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

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

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

最新更新