前言
在ceph的研发群里看到一个cepher提出一个问题,编译的ceph的二进制文件过大,因为我一直用的打包好的rpm包,没有关注这个问题,重新编译了一遍发现确实有这个问题
本篇就是记录如何解决这个问题的
打rpm包的方式
用我自己的环境编译的时候发现一个问题,编译出来的rpm包还是很大,开始怀疑是机器的原因,换了一台发现二进制包就很小了,然后查询了很多资料以后,找到了问题所在
在打rpm包的时候可以通过宏变量去控制是否打出一个的debug的包,这个包的作用就是把二进制文件当中包含的debug的相关的全部抽离出来形成一个新的rpm包,而我的环境不知道什么时候在/root/.rpmmacros添加进去了一个
%debug_package %{nil}
搜寻资料后确定就是这个的问题,这个变量添加了以后,在打包的时候就不会进行debug相关包的剥离,然后打出的包就是巨大的,可以这样检查自己的rpmbuild的宏变量信息
[root@host1 ceph-10.2.6]# rpmbuild --showrc|grep debug_package
%{!?__debug_package:
%{?__debug_package:%{__debug_install_post}}
-14: _enable_debug_packages 1
-14: debug_package
%global __debug_package 1
-14: install %{?_enable_debug_packages:%{?buildsubdir:%{debug_package}}}
如果开启了debug包抽离(默认就是开启的),那么rpmbuild在打包的过程中会有个调用
/usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /root/rpmbuild/BUILD/ceph-10.2.5
这个就是rpmbuild过程中,进行抽离debug信息的操作,也就是缩小二进制的过程,这个并不能直接执行命令,需要用rpmbuild -bb ceph.spec 打包的时候内部自动进行调用的
上面是rpm打包过程中进行的二进制缩小,那么如果我们是源码编译安装时候,如何缩小这个二进制,答案当然是可以的
源码编译安装的方式
./configure 后make生成的二进制文件就在./src下面了
我们以ceph-mon为例进行抽离
这个-O3并没有影响到太多的生成的二进制的大小,--with-debug会有一定的影响,关键还是strip的这个操作
./configure --with-debug CXXFLAGS=-O3 CFLAGS=-O3 CCASFLAGS=-O3
所以默认的就行
如果整体进行安装就使用make install-strip安装即可
[root@host1 ceph-10.2.6]# make install-strip
[root@host1 ceph-10.2.6]# ll /usr/local/bin/ceph-osd
-rwxr-xr-x 1 root root 14266576 Mar 23 17:57 /usr/local/bin/ceph-osd
[root@host1 ceph-10.2.6]# ll /usr/local/bin/ceph-osd -hl
-rwxr-xr-x 1 root root 14M Mar 23 17:57 /usr/local/bin/ceph-osd
[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl
-rwxr-xr-x 1 root root 248M Mar 23 17:54 src/ceph-osd
关键的strip的用法
gcc编译的时候带上-g参数,就是添加了debug的信息
gcc -g -o
分离debug information
[root@host1 ceph-10.2.6]#objcopy --only-keep-debug src/ceph-osd src/ceph-osd.debug
[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl
-rwxr-xr-x 1 root root 248M Mar 23 17:54 src/ceph-osd
[root@host1 ceph-10.2.6]# ll src/ceph-osd.debug -hl
-rwxr-xr-x 1 root root 235M Mar 23 18:08 src/ceph-osd.debug
另外一种方法:
[root@host1 ceph-10.2.6]# cp src/ceph-osd src/ceph-osd.debug
[root@host1 ceph-10.2.6]# strip --only-keep-debug src/ceph-osd.debug
[root@host1 ceph-10.2.6]# ll src/ceph-osd.debug -hl
-rwxr-xr-x 1 root root 235M Mar 23 18:10 src/ceph-osd.debug
从原始文件去掉 debug information
[root@host1 ceph-10.2.6]# objcopy --strip-debug src/ceph-osd
[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl
-rwxr-xr-x 1 root root 18M Mar 23 18:11 src/ceph-osd
objcopy --strip-debug main
另外一种方法:
[root@host1 ceph-10.2.6]# strip --strip-debug --strip-unneeded src/ceph-osd
[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl
-rwxr-xr-x 1 root root 14M Mar 23 18:12 src/ceph-osd
启用debuglink模式
[root@host1 ceph-10.2.6]# objcopy --add-gnu-debuglink src/ceph-osd.debug src/ceph-osd
[root@host1 ceph-10.2.6]# gdb src/ceph-osd
或者
[root@host1 ceph-10.2.6]# gdb -s src/ceph-osd.debug -e src/ceph-osd
总结
二进制包里面包含了debug的一些相关信息,可以通过strip的方式将内部的debug内容清理掉,这样就可以得到比较小的二进制包了
变更记录
Why | Who | When |
---|---|---|
创建 | 武汉-运维-磨渣 | 2017-03-23 |