gcc -O2 比 gcc -O2 -g 小,然后是 strip --strip-all
gcc -O2 is smaller then gcc -O2 -g followed by strip --strip-all
我正在构建我想要生成发布版本的代码。但是,如果它们崩溃,我也希望能够调试 cores
。
所以我读到可以使用带有调试符号的构建,然后生成您 运行 剥离的二进制文件的副本。然后你可以获取由剥离的二进制文件(released/customer 二进制文件)生成的核心,然后将其与带有调试符号的二进制文件副本进行 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 添加的所有调试符号。但是 "extra stuff" 大约有 0.4Mb - 它由什么组成?
区别在于调试代码。
对于 1.7 MB 的可执行文件,您可能正在使用一两个库。通常他们有这样的东西:
#ifdef _DEBUG
// some debug code
#endif
也是大型项目的常见做法,因此其中一些可能也是您的代码。
strip
仅删除符号。调试代码保留。
我正在构建我想要生成发布版本的代码。但是,如果它们崩溃,我也希望能够调试 cores
。
所以我读到可以使用带有调试符号的构建,然后生成您 运行 剥离的二进制文件的副本。然后你可以获取由剥离的二进制文件(released/customer 二进制文件)生成的核心,然后将其与带有调试符号的二进制文件副本进行 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 添加的所有调试符号。但是 "extra stuff" 大约有 0.4Mb - 它由什么组成?
区别在于调试代码。
对于 1.7 MB 的可执行文件,您可能正在使用一两个库。通常他们有这样的东西:
#ifdef _DEBUG
// some debug code
#endif
也是大型项目的常见做法,因此其中一些可能也是您的代码。
strip
仅删除符号。调试代码保留。