前言

在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

最新文章

  1. Sublime Text 3 高效编码快捷键
  2. 《Android深度探索》(卷1)HAL与驱动开发读后感:
  3. 如何获取imageView中当前内容的相关信息并比较?
  4. 设置程序集(dll)引用路径,整洁美观
  5. html5+ 获取当前设备的加速度信息
  6. 关于jQuery的bind()\trigger()\triggerHandler()
  7. C语言每日一题之No.12
  8. 关于webpack最好的文档
  9. Java中windows路径转换成linux路径等工具类
  10. STL源码剖析之list的sort函数实现
  11. 身为java程序员你需要知道的网站(包含书籍,面试题,架构...)
  12. ng-select ng-options ng-repeat的用法与区别
  13. 【Git使用具体解释】EGit使用具体解释
  14. 对比 Git 与 SVN,这篇讲的很易懂
  15. win10安装spacemacs
  16. Loj #528. 「LibreOJ β Round #4」求和 (莫比乌斯反演)
  17. Postman导出Api文档
  18. IOI2008 island
  19. Cascade R-CNN论文讲解(转载)
  20. Filter and servlet

热门文章

  1. spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)
  2. linux wget指定下载目录和重命名
  3. python爬取知乎评论
  4. Prometheus入门教程(三):Grafana 图表配置快速入门
  5. 常见的Python运行时错误
  6. uart接口介绍和认识
  7. 用匿名内部类实现 Java 同步回调
  8. Kerberos与票据的爱情故事
  9. JS常用事件的总结
  10. Java学习的第三十五天