简介
gcc -g
会创建符号表,符号表包含了程序中使用的变量名称的列表,关闭所有的优化机制,以便程序执行过程中严格按照原来的C代码进行- 在编写spec的时,如果不希望生成debug包,则可以加
%define debug_package %{nil}
屏蔽掉在rpmbuild过程中的校验。
场景1:
- spec文件中加
%define debug_package %{nil}
- spec文件加了
cmake .. -DCMAKE_BUILD_TYPE=Debug
或者cmakelist
中加-g
那么在执行rpmbuild -ba xxx.spec
时,/root/rpmbuild/BUILD/hello-1.0/build
路径下会生成带debug信息的二进制
Type "apropos word" to search for commands related to "word"...
Reading symbols from hello...
(gdb)
然后构建出来的rpm安装后,是不带符号信息的
[root@localhost x86_64]# gdb /usr/bin/hello
...
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/hello...
(No debugging symbols found in /usr/bin/hello)
这是因为在构建过程中,调用了/usr/bin/strip
,
+ /usr/lib/rpm/brp-strip /usr/bin/strip
+ /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1 1
+ /usr/lib/rpm/brp-python-hardlink
# GPT
`/usr/bin/strip` 是一个二进制程序,它属于 GNU Binutils 工具集的一部分,主要用于处理二进制文件(如可执行文件、动态链接库等),执行以下操作以优化或缩小文件大小:**去除符号表**(Symbol Table):`strip` 命令可以移除二进制文件中的符号表信息。符号表包含了函数名、变量名、全局常量名等符号及其在内存中的地址映射,对于程序调试非常有用。但在发布或部署阶段,这些信息对于最终用户并不必要,移除它们可以显著减小二进制文件的大小。**剥离调试信息**:除了符号表,`strip` 还能去除编译时加入的调试信息(如 DWARF 调试信息),这些信息对于调试器(如 `gdb`)定位源代码、查看变量值等非常关键,但同样增加了二进制文件的大小。在发布版本中移除这些调试信息可以进一步压缩文件。**优化**:除了纯粹的尺寸缩减,`strip` 还可能进行一些优化,如合并重复的字符串、消除未引用的符号等,进一步提高二进制文件的性能或减少其占用空间。
可以做个测试,对一个带调试信息的二进制
[root@localhost build]# /usr/bin/strip hello
[root@localhost build]# gdb hello
Reading symbols from hello...
(No debugging symbols found in hello)
场景2
- spec文件中不加
%define debug_package %{nil}
- spec文件加
cmake .. -DCMAKE_BUILD_TYPE=Debug
<