GCC:避免在使用静态数组时长时间链接

bor*_*sbn 5 gcc

我的问题实际上是重复这一个,它要求为什么这个问题会发生.我想知道是否有可能避免它.

问题是:如果我静态分配大量内存:

unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
Run Code Online (Sandbox Code Playgroud)

然后linker(ld)需要很长时间才能生成可执行文件.@davidg对我上面提到的这个问题有一个很好的解释:

这给我们留下了以下一系列步骤:

  1. 汇编器告诉链接器它需要创建一个1GB长的内存段.

  2. 链接器继续并分配此内存,以准备将其放入最终的可执行文件中.

  3. 链接器意识到此内存位于.bss部分并标记为NOBITS,这意味着数据只是0,并且不需要物理放入最终的可执行文件中.它避免写出1GB的数据,而只是抛弃分配的内存.

  4. 链接器只向编译的代码写入最终的ELF文件,生成一个小的可执行文件.

更智能的链接器可能能够避免上面的步骤2和3,从而使编译时间更快

好.@davidg解释了为什么链接器需要花费很多时间,但我想知道如何避免它.也许GCC有一些选择,会对链接器说到be a little smarteravoid steps 2 and 3 above

谢谢.

PS我在Ubuntu使用GCC 4.5.2

per*_*eal 1

您只能在发布版本中分配静态内存:

#ifndef _DEBUG
    unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
#else
    unsigned char *static_data;
#endif
Run Code Online (Sandbox Code Playgroud)