如何将全局变量放置相邻? (无需在链接描述文件中设置)

how to place global variables placed adjacent? (without setting it at linker script)

我想将3个变量彼此相邻放置32个字节。这是为了调试,一个可疑的行为。
对于这行C代码(sparc,裸机,在函数外定义一个全局变量。)

int __attribute__ ((aligned (32))) xx0, layer_complete, xx1;

仅使用这段代码,变量 xx0、xx1、layer_complete 对齐到 32 字节,但在 layer_complete 之后放置了一些变量。我只想将一个变量放在 32 位范围内。 (话虽如此,我有使用union的想法。但是我很好奇如果没有union我是否可以做到)。

A​​DD :我用 union 试过这个(在 layer_complete 之后做一些 space)

union ttt {
    int layer_complete;
    int a[8]; // to make it 32 bytes
} __attribute__((aligned(32))) lc_union;
#define layer_complete lc_union.layer_complete

检查program.map我可以看到layer_complete是32字节对齐的,后面的28字节没有使用(当然)。

这应该可以解决问题:

typedef struct
{
   int _Alignas(32) xx0;
   int _Alignas(32) layer_complete;
   int _Alignas(32) xx1;
} thing;
...
thing t;

如果您出于某种原因使用的是非常旧的 gcc 版本(C11 之前的版本,4.x 或更早的版本),那么您也可以使用非标准的 __attribute__ ((aligned (32))).

由于这只是为了调试目的,您可以制作 #define xx0 t.xx0 等宏,使结构与您已有的结构兼容。

类似的东西:

char memVar96[96];

void *ptr1 = memVar96;
void *ptr2 = &memVar96[32];
void *ptr3 = &memVar96[64];

#define var1  (*(MyVarType1*)ptr1)
#define var2  (*(MyVarType2*)ptr2)
#define var3  (*(MyVarType3*)ptr3)