【发布时间】:2018-02-24 07:56:00
【问题描述】:
用arm gcc交叉编译aarch64,结构如下:
struct lock {
uint32_t lk;
};
总是被编译成一个与 8 个字节对齐的地址。
当我尝试将结构放到 4 字节对齐的地址上时,gcc 将在结构之前填充 4 个空字节以使其位于 8 字节对齐的地址上。
这是约定吗?或者我可以将其配置为 4 个字节对齐。
ldscript:
SECTIONS {
.init.data : {
*(.init.data.v);
*(.init.data.l);
} > INIT_DATA
}
在 .init.data.v 中有一个 uint32_t,然后在 .init.data.l 中有一个结构锁变量,但它们之间有一个 4 字节的填充。 如果代码在 .init.data.v 中有一个 uint32_t,然后在 .init.data.l 中有另一个 uint32_t,则没有 4 字节填充。
所以只有结构变量会导致这个 4 字节填充。
【问题讨论】:
-
你的链接脚本是什么?
-
我把这个结构体放在链接描述文件的一个用户定义的部分,从8字节对齐的地址开始,第一个变量是一个uint32_t,然后是这个结构体,但是它们之间有一个4字节的空填充
-
我会尝试在链接描述文件中设置它。我现在没有任何类似的项目 - 所以不能尝试并且没有时间创建一个新项目。
-
为什么要更改对齐方式?
-
来自 Linaro 的某个人给了我下面的链接,它谈到了同样的问题,他鼓励报告对齐属性缺失的错误:gcc.gnu.org/ml/gcc-patches/2017-06/msg00317.html