我真的需要libgcc吗?

我一直在Mac OS X 10.6上使用GCC 4.6.2。 我在编译时使用-static-libgcc选项,否则我的二进制文件在系统上查找libgcc并且我不确定OS X上是否支持GCC 4.2。这样可以正常工作,但为什么我甚至需要libgcc? 我读了它并且GNU文档说它包含“目标处理器不能直接执行的算术运算”。 我怎么知道这些操作是什么? 为什么它们如此复杂以至于我需要包含这个库? 为什么GCC不能直接优化代码而不必诉诸这些库函数? 我有点困惑。 对此有任何见解将不胜感激!

是的,你确实需要它…. 如果你不需要它,那么静态链接它是无害的。 您可以使用-t link trace选项(我认为)来判断您是否需要它。

在一条指令中你可以做很多事情(通常是32位架构上的64位操作)。 这些事情都可以完成,但是如果它们使用了非常少量的指令,那么将它们全部集中在一个地方就更节省空间了。

当您使用-O0禁用优化时(无论如何它实际上是默认值),GCC几乎总是使用libgcc例程。

当您启用速度优化时,GCC可以选择将指令序列直接插入代码中(如果它知道如何)。 您可能会发现它最终没有使用任何libgcc版本 – 它肯定会使用更少的libgcc调用。

当您启用大小优化时,GCC可能更喜欢函数调用,或者可能不是 – 它取决于GCC开发人员认为在每种情况下最佳速度/大小权衡。 请注意,即使您告诉它优化速度,编译器也可能会判断某些function不太可能被使用,并根据大小进行优化 – 如果您使用PGO则更是如此。

基本上,你可以用与memcpy或math-library函数相同的方式来思考它:编译器将内联它认为有益的函数,否则调用库函数。 编译器可以“内联”标准函数和libgcc函数,而无需查看库定义,当然 – 它只是“知道”它们的作用。

是否使用静态或动态libgcc是一个有趣的权衡。 一方面,动态(共享)库将在整个系统中使用更少的内存,并且更有可能被缓存等。另一方面,静态libgcc具有较低的调用开销。

最重要的是兼容性。 显然,libgcc库必须存在才能运行程序,但它也必须是兼容版本 。 你可以在具有稳定GCC版本的Linux发行版上使用,但静态链接更安全。

我希望能回答你的问题。