在gcc中启用优化时,特定部分的变量顺序

时间:2019-03-07 11:26:51

标签: c gcc

这是一个非常简单的测试用例:

int a __attribute__ ((section("section")));
int b __attribute__ ((section("section")));
int c __attribute__ ((section("section")));

如果我使用GCC 8编译了该文件,没有进行优化,并且转储了目标文件,我将按照源文件中的确切顺序获取变量:

$ gcc -c order.c
$ nm -n order.o
0000000000000000 D a
0000000000000004 D b
0000000000000008 D c

但是,如果启用优化(任何级别),变量将在内存中反转:

$ gcc -O -c order.c
$ nm -n order.o
0000000000000000 D c
0000000000000004 D b
0000000000000008 D a

由于我需要在程序的不同版本的特定内存部分中保持各种变量的一致地址,因此我决定将所有这些变量放在同一源文件中。这是针对嵌入式项目的,我正在使用的内存部分具有备用电池电源,因此在关闭设备电源时其内容不会丢失。但是,我还需要“旧”对象的地址保持不变,并且我不希望在添加一些“新”对象时更改它们。

所以我想知道GCC的这种特殊行为是否可以通过任何编译器标志(禁用优化[;除外)来控制,并且在不同版本的GCC之间是否一致?例如,我可以假设在GCC 11中,到2022年,变量在内存中的顺序仍然与源文件中的顺序相反,或者也许某天该顺序将与今天在GCC 8中的顺序不同?

0 个答案:

没有答案