【问题标题】:alignment in user defined sections in gccgcc中用户定义部分的对齐方式
【发布时间】:2015-07-16 15:18:28
【问题描述】:

似乎 gcc 中以 x86 为目标的 >= 32 字节的顶级对象会自动获得 32 字节对齐。这可能对性能有好处,但我正在从用户定义部分中的所有目标文件中收集一组东西,而额外的对齐间隙会对这个数组造成严重破坏。有什么办法可以防止这种对象对齐吗?

为了澄清,我有一个低对齐的结构,不同的目标文件定义 用户定义部分中该结构的数组形式的数据,其中 目的是使一个应用程序范围广泛。 一旦这些数组之一> = 32,对象对齐和节对齐被推到32,当链接器将目标文件中的单独部分连接到可执行文件中时,它会在模块边界处创建对齐填充那个部分。

【问题讨论】:

    标签: gcc linker memory-alignment object-files


    【解决方案1】:

    以下程序说明了一个可能的解决方案,假设 GCC 您可以接受扩展名:

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    
    #define ALIGNMENT // __attribute__ ((aligned (8))) 
    
    struct A {
        char arr[40];
    } ;
    
    struct A a __attribute__ ((section ("my_data"))) ALIGNMENT = {{'a'}};
    struct A b __attribute__ ((section ("my_data"))) ALIGNMENT = {{'b'}};
    struct A c __attribute__ ((section ("my_data"))) ALIGNMENT = {{'c'}};
    
    int main(int argc, char **argv)
    {
        assert(sizeof(struct A) == 40);
        printf("%c\n",a.arr[0]);
        printf("%c\n",b.arr[0]);
        printf("%c\n",c.arr[0]);
        printf("%lu\n",(unsigned long)(&a));
        printf("%lu\n",(unsigned long)(&b));
        printf("%lu\n",(unsigned long)(&c));
        return 0;
    }
    

    我的输出是:

    a
    b
    c
    6295616
    6295680
    6295744
    

    请注意,在我的(64 位)可执行文件中,三个 40 字节结构中的每一个 是 64 字节对齐的。

    现在取消注释// __attribute__ ((aligned (8))),重建并重新运行。我的 然后输出是:

    a
    b
    c
    6295616
    6295656
    6295696
    

    现在结构是 8 字节对齐的,没有间隙。

    【讨论】:

    • 是的,就是这样。我曾尝试将它作为类型对齐添加到“struct A”中。对象对齐做得更好。
    • @MartiendeJong 欢迎来到 SO。如果这个答案解决了你的问题,你可以accept it
    猜你喜欢
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多