c++ - gcc -O2 比 gcc -O2 -g 小,然后是 strip --strip-all
问题描述
我正在构建要生成发布版本的代码。cores
但是,如果它们崩溃,我也希望能够进行调试。
所以我读到可以使用带有调试符号的构建,然后生成运行 strip 的二进制文件的副本。然后,您可以获取剥离的二进制文件(已发布/客户二进制文件)生成的核心,然后将其与带有调试符号的二进制文件副本 gdb...
所以对我来说第一步是生成二进制文件,我这样做:
gcc -O2 ... -o testbin_release_orig
(原始释放箱无符号)gcc -O2 -g ... -o testbin_debug
(完整的调试二进制文件)cp testbin_debug testbin_release
strip --strip-all testbin_release
(剥离的调试二进制文件)
这会产生三个不同大小的文件:
- testbin_release_orig:~1.7Mb
- testbin_debug: ~13Mb
- testbin_release:~2.1Mb
我的问题是,为什么testbin_release
大小不完全一样testbin_release_orig
?我猜 strip 不能去掉 gcc 添加的所有调试符号。但是有大约 0.4Mb 的“额外的东西”——它是由什么组成的?
解决方案
区别在于调试代码。
对于 1.7 MB 的可执行文件,您可能正在使用一两个库。通常他们有类似的东西:
#ifdef _DEBUG
// some debug code
#endif
也是大型项目的常见做法,因此其中一些也可能是您的代码。
strip
仅删除符号。调试代码保留。
推荐阅读
- python - 我正在使用 SMTPLib 向 gmail 帐户发送电子邮件
- postgresql - 使用 Postgres 视图导入/导出数据
- ios - 自定义 FUIEmailEntryViewController 不显示电子邮件输入字段
- javascript - 正则表达式在斜杠的第二个实例后捕获整个字符串
- java - 为什么 Tomcat 8 不在容器中启动?
- javascript - 如何使用 j 查询在输入文本字段中动态给出国家、州列表进行编辑
- html - 将导航栏搜索表单和中心的按钮与 Bootstrap 4 对齐
- java - 尝试修改其他类中的 HashMap 时的 NPE
- python - 如何仅使用 pytest 报告一种异常类型的失败?
- numpy - 有效地将 0 分配给 2D numpy 数组中每一行的多列