ams*_*ams 18
是的,你确实需要它.... 如果你不需要它,那么静态链接它是无害的.您可以使用-t链接跟踪选项(我认为)来判断您是否需要它.
在一条指令中你可以做很多事情(通常是32位架构上的64位操作).这些事情都可以完成,但如果他们使用了非常重要的指令,那么将它们全部放在一个地方就更节省空间了.
当您使用-O0(实际上是默认值)禁用优化时,GCC几乎总是使用libgcc例程.
当您启用速度优化时,GCC可以选择将指令序列直接插入代码中(如果它知道如何).您可能会发现它最终没有使用任何libgcc版本 - 它肯定会使用更少的libgcc调用.
当您启用大小优化时,GCC可能更喜欢函数调用,或者可能不是 - 它取决于GCC开发人员认为在每种情况下最佳速度/大小权衡.请注意,即使您告诉它优化速度,编译器也可能判断某些功能不太可能被使用,并优化大小 - 如果您使用PGO则更是如此.
基本上,你可以用与memcpy数学库函数相同的方式来思考它:编译器将内联它认为有益的函数,否则调用库函数.编译器可以"内联"标准函数和libgcc函数,而无需查看库定义,当然 - 它只是"知道"它们的作用.
是否使用静态或动态libgcc是一个有趣的权衡.一方面,动态(共享)库将在整个系统中使用更少的内存,并且更有可能被缓存等.另一方面,静态libgcc具有较低的调用开销.
最重要的是兼容性.显然,libgcc库必须存在才能运行程序,但它也必须是兼容版本.你可以在具有稳定GCC版本的Linux发行版上使用,但静态链接更安全.
我希望能回答你的问题.