使用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
}
有一个uint32_t放在.init.data.v中,然后一个结构锁定变量放在.init.data.l中,但在它们之间有一个4字节的填充。 如果代码在.init.data.v中有一个uint32_t,那么在.init.data.l中有另一个uint32_t,那里有4个字节的填充。
因此,只有struct变量才会导致这个4字节的填充。
答案 0 :(得分:1)
我想,这是为了提高数据访问性能 - 你说的是64位CPU。
答案 1 :(得分:1)
本网站上有很多问题。
您可能需要将-munaligned-access
传递给编译器才能执行此操作,具体取决于您的确切目标处理器。这确实提出了为什么在这里的问题。
另见
答案 2 :(得分:0)
asm(".global _start; _start: b .");
struct lock {
unsigned int lk;
};
struct lock x;
unsigned char a;
unsigned short b;
struct lock y;
void centry ( void )
{
}
Gcc正在尝试对齐
Disassembly of section .text:
0000000000001000 <_start>:
1000: 14000000 b 1000 <_start>
1004: d503201f nop
0000000000001008 <centry>:
1008: d65f03c0 ret
Disassembly of section .bss:
0000000000002000 <b>:
...
0000000000002008 <x>:
...
0000000000002010 <y>:
2010: 00000000 .inst 0x00000000 ; undefined
0000000000002014 <a>:
2014: 00000000 .inst 0x00000000 ; undefined
如果你能避免它,你真的不应该打架。如果你试图在编译域中指出结构,那么无论如何你都会遇到麻烦。
asm(".global _start; _start: b .");
struct lock {
unsigned int lk;
};
struct lock x;
unsigned char a;
unsigned short b;
unsigned int c;
unsigned int d;
struct lock y;
unsigned int e;
void centry ( void )
{
}
有效
Disassembly of section .text:
0000000000001000 <_start>:
1000: 14000000 b 1000 <_start>
1004: d503201f nop
0000000000001008 <centry>:
1008: d65f03c0 ret
Disassembly of section .bss:
0000000000002000 <b>:
...
0000000000002008 <x>:
2008: 00000000 .inst 0x00000000 ; undefined
000000000000200c <c>:
200c: 00000000 .inst 0x00000000 ; undefined
0000000000002010 <y>:
2010: 00000000 .inst 0x00000000 ; undefined
0000000000002014 <d>:
2014: 00000000 .inst 0x00000000 ; undefined
0000000000002018 <a>:
2018: 00000000 .inst 0x00000000 ; undefined
000000000000201c <e>:
201c: 00000000 .inst 0x00000000 ; undefined
我不会依赖这些设置或它们如何排列,你让编译器在结构上设置对齐和打包,以便理想情况下不会产生对齐错误或性能命中。如果你开始捣乱,只是惹麻烦,可能需要几天或几年的时间来解决问题,但最终还是会发生。