c++ - 有什么理由不从可执行文件中删除符号吗?

标签 c++ c compilation mingw

几年前我问过a question如何减少可执行文件的大小。使用 MinGW 编译器,剥离符号(-s 选项)有助于减少 50% 以上的大小。

为什么剥离不是默认的——在某些情况下为什么不剥离符号有什么好的理由吗?我想更深入地理解它:今天,我只是模糊地知道链接库涉及符号。可执行文件中是否需要它们?它们是否会影响执行速度?

最佳答案

我无法想象它们会以任何明显的方式影响执行速度,但理论上,进程镜像中可能会有微小的缓存未命中。

您希望在调试文件时将符号保留在文件中,以便您可以看到您在哪个函数中,检查变量的值等等。

但是符号会使文件变大:可能会变大很多。因此,您不希望放在小型嵌入式设备上的二进制文件中有符号。 (我说的是真正的嵌入式设备,而不是具有 9,000GB 存储空间的 21 世纪 Raspberry Pi!)

我通常会删除所有发布版本,不会删除任何调试版本。这使得来自客户的核心转储的用处略微降低,但您始终可以保留一份未剥离的发布版本并根据它调试您的核心。

我确实听说过一家公司制定了即使在发布版本中也绝不剥离符号的政策,因此他们可以将内核直接加载到调试器中。这对我来说似乎有点抽象泄漏,但无论如何。他们的电话。

当然,如果你真的想要,你可以在没有它们的情况下自己分析程序集。但这太疯狂了……

关于c++ - 有什么理由不从可执行文件中删除符号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32211913/

相关文章:

c++ - [C++][DPDK] 创建一个正确的 "private size"字节对齐的 rte_mempool

c - 通过 ISO_C_BINDING 传递 Fortran 数组

c++ - 在 cygwin 中使用 libcurl 编译项目

c++ - 如何在实例化数组类后插入整个数组 [C++]

c++ - 将 LARGE_INTEGER.QuadPart 作为 size_t 的输出参数传递是否安全?

c++ - 如何在 Windows 上清理命名管道?

c - 错误: #error "must define number of sample times, NUMST"

c++ - AVR GCC 本地数组初始化

c - Freeimage ANSI C Codeblock Windows - 链接 - 新手

java - 为什么使用条件编译后 apk 大小相同