我的问题实际上是重复这个问题,它询问为什么会出现这个问题。我想知道是否可以避免它。
问题是:如果我静态分配大量内存:
unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
然后链接器(ld
)需要很长时间才能生成可执行文件。@davidg 对我上面给出的这种行为有一个很好的解释:
这给我们留下了以下一系列步骤:
汇编器告诉链接器它需要创建一段 1GB 长的内存。
链接器继续分配此内存,以准备将其放入最终的可执行文件中。
链接器意识到此内存位于 .bss 部分并标记为 NOBITS,这意味着数据只是 0,不需要物理放置到最终的可执行文件中。它避免写出 1GB 的数据,而只是丢弃分配的内存。
链接器仅将编译后的代码写入最终的 ELF 文件,生成一个小的可执行文件。
更智能的链接器可能能够避免上面的步骤 2 和 3,从而使您的编译时间更快
好的。@davidg 解释了为什么链接器需要很多时间,但我想知道如何避免它。也许 GCC 有一些选项,会说链接器 tobe a little smarter
和 to avoid steps 2 and 3 above
?
谢谢你。
PS 我在 Ubuntu 使用 GCC 4.5.2