【发布时间】:2013-06-13 08:20:32
【问题描述】:
我的问题实际上是重复this one,它询问为什么会出现这个问题。我想知道是否可以避免它。
问题是:如果我静态分配大量内存:
unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
然后链接器 (ld) 需要很长时间才能生成可执行文件。 @davidg 对我上面给出的这种行为有一个很好的解释:
这给我们留下了以下一系列步骤:
汇编器告诉链接器它需要创建一段 1GB 长的内存。
链接器继续分配内存,准备将其放入最终的可执行文件中。
链接器意识到此内存位于 .bss 部分并标记为 NOBITS,这意味着数据只是 0,不需要物理放置到最终的可执行文件中。它避免写出 1GB 的数据,而只是丢弃分配的内存。
链接器将编译后的代码写入最终的 ELF 文件,生成一个小的可执行文件。
更智能的链接器可能能够避免上面的第 2 步和第 3 步,从而使您的编译时间更快
好的。 @davidg 解释了为什么链接器需要很多时间,但我想知道如何避免它。也许 GCC 有一些选项,比如链接到 be a little smarter 和 avoid steps 2 and 3 above ?
谢谢。
附:我在 Ubuntu 上使用 GCC 4.5.2
【问题讨论】:
-
尝试使用静态全局变量。
-
我稍微澄清了你的问题和标题,所以读者不必直接阅读最后一段就可以了解问题是什么,或者为什么它不是重复的。希望你不要介意。 :)
-
@Claudio 我确实使用了静态全局变量。
-
@jalf 非常好的变化。非常感谢。
-
你能避免使用静态全局吗? :) malloc 不是一个选项?
标签: gcc