aarch64

时间:2017-09-15 07:39:25

标签: c gcc arm

使用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字节的填充。

https://pastebin.com/kRsmPwrS

3 个答案:

答案 0 :(得分:1)

我想,这是为了提高数据访问性能 - 你说的是64位CPU。

答案 1 :(得分:1)

本网站上有很多问题。

您可能需要将-munaligned-access传递给编译器才能执行此操作,具体取决于您的确切目标处理器。这确实提出了为什么在这里的问题。

另见

Does AArch64 support unaligned access?

Linaro g++ aarch64 compilation cause unalignment fault

答案 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

我不会依赖这些设置或它们如何排列,你让编译器在结构上设置对齐和打包,以便理想情况下不会产生对齐错误或性能命中。如果你开始捣乱,只是惹麻烦,可能需要几天或几年的时间来解决问题,但最终还是会发生。