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