c++ - gcc -O2 小于 gcc -O2 -g 后跟 strip --strip-all

标签 c++ linux gcc strip

我正在构建想要生成发布版本的代码。不过,我还希望能够在核心崩溃时对其进行调试。

所以我读到可以使用调试符号进行构建,然后生成运行 strip 的二进制文件的拷贝。然后,您可以获取由剥离的二进制文件(已发布/客户二进制文件)生成的核心,然后将其与带有调试符号的二进制文件拷贝进行 gdb...

所以对我来说第一步是生成二进制文件,我这样做:

  • gcc -O2 ... -o testbin_release_orig(不带符号的原始版本 bin)
  • 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 仅删除符号。调试代码保留。

关于c++ - gcc -O2 小于 gcc -O2 -g 后跟 strip --strip-all,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57689931/

相关文章:

c++ - 无法释放从 iplimage 创建的 mat 图像

linux - 对 "kernel process"的疑问

c - Malloc 内存问题

c++ - 按名称或签名计算函数调用。海合会,C++

c++ - 在 Visual C++ 2010 Express 中安装 OpenCV 2.4.3

c++ - 枚举 [标签] [ : type] {enum-list} [declarator] in C++ - is this legal?

c++ - 无法使用复印功能

php - 在 Linux 上使用 PHP 编辑 MS Access 数据库

linux - 如何使用Qextserialport在串口上写

linux - 从设备与 sysroot 交叉编译