c - 我真的需要 libgcc 吗?

标签 c macos cocoa gcc

我一直在 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/

相关文章:

C - 设置 'popen' 子进程的标准输入 - 跨平台

java - Java和C socket编程之间的结构数据通信

objective-c - 如何以编程方式调暗 Mac 背光键盘

objective-c - 使用-mutableCopyWithZone : on custom class makes it immutable

c - 如何在 C 中的结构中包含动态数组?

macos - mac os x - usb hid - 如何添加接收设备/设备删除回调?

macos - "You don' t 对/usr/bin 目录具有写权限。” 使用 Gem 命令安装 Sass 时

macos - 测量 OS X 中耗时

objective-c - 弧: how do I dealloc at the end of object life cycle?

c - 运行时错误 : signed integer overflow: 99998 * 100000 cannot be represented in type 'int' [solution. c]