gcc 中用户定义部分的对齐

alignment in user defined sections in gcc

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

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

以下程序说明了一个可能的解决方案,假定 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 字节对齐的,没有间隙。