我一直在 Mac OS X 10.6 上使用 GCC 4.6.2。我在编译时使用 -static-libgcc 选项,否则我的二进制文件会在系统上寻找 libgcc,我不确定 OS X 是否支持 GCC 4.2 以上的任何内容。这很好用,但为什么我什至需要 libgcc?我仔细阅读了它,GNU 文档说它包含“目标处理器无法直接执行的算术运算”。我怎么知道这些操作是什么?为什么它们如此复杂以至于我需要包含这个库?为什么 GCC 不能直接优化代码而不必求助于这些库函数?我有点困惑。对此有任何见解将不胜感激!
最佳答案
是的,你确实需要它......可能。如果您不需要它,那么静态链接它是无害的。您可以通过使用 -t
链接跟踪选项(我认为)来判断您是否需要它。
有很多事情是您不能在一条指令中完成的(通常是 32 位架构上的 64 位操作)。这些事情可以完成,但如果它们使用大量指令,那么将它们全部放在一个地方会更节省空间。
当您使用 -O0
禁用优化(无论如何这实际上是默认设置)时,GCC 几乎总是使用 libgcc 例程。
当您启用速度 优化时,GCC 可能会选择将指令序列直接插入到代码中(如果它知道如何操作)。您可能会发现它最终没有使用任何 libgcc 版本 - 它肯定会使用更少的 libgcc 调用。
当您启用大小 优化时,GCC 可能更喜欢函数调用,也可能不喜欢 - 这取决于 GCC 开发人员认为在每种情况下最佳的速度/大小权衡。请注意,即使您告诉它针对速度进行优化,编译器也可能会判断某些函数不太可能被使用,并针对大小优化它们 - 如果您使用 PGO,情况更是如此。
基本上,您可以将其视为与 memcpy
或数学库函数相同的方式:编译器将内联它认为有益的函数,否则调用库函数。编译器可以在不查看库定义的情况下“内联”标准函数和 libgcc 函数,当然 - 它只是“知道”它们的作用。
使用静态还是动态 libgcc 是一个有趣的权衡。一方面,动态(共享)库将在整个系统中使用较少的内存,并且更有可能被缓存等。另一方面,静态 libgcc 的调用开销较低。
不过最重要的是兼容性。显然,libgcc 库必须存在才能让您的程序运行,但它也必须是兼容的版本。您可以在具有稳定 GCC 版本的 Linux 发行版上使用,但静态链接更安全。
我希望这能回答您的问题。
关于c - 我真的需要 libgcc 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9414625/