5

我的问题实际上是重复这个问题,它询问为什么会出现这个问题。我想知道是否可以避免它。

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

unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];

然后链接器(ld)需要很长时间才能生成可执行文件。@davidg 对我上面给出的这种行为有一个很好的解释:

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

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

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

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

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

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

好的。@davidg 解释了为什么链接器需要很多时间,但我想知道如何避免它。也许 GCC 有一些选项,会说链接器 tobe a little smarter和 to avoid steps 2 and 3 above

谢谢你。

PS 我在 Ubuntu 使用 GCC 4.5.2

4

2 回答 2

1

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

#ifndef _DEBUG
    unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
#else
    unsigned char *static_data;
#endif
于 2013-06-13T08:46:35.100 回答
0

我有两个想法可以提供帮助:

  1. 正如一些评论中已经提到的:将它放在一个单独的编译单元中。这本身不会减少链接时间。但也许与增量链接一起它会有所帮助(ld 选项-r)。
  2. 其他类似。将它放在一个单独的编译单元中,并从中生成一个共享库。稍后再与共享库链接。

遗憾的是,我不能保证其中一个会有所帮助,因为我无法测试:我的 gcc(4.7.2) 和 bin 工具没有显示这种耗时的行为,8、16 或 32 GB 的测试程序在一秒钟内编译和链接.

于 2013-06-13T09:34:55.753 回答