zoukankan      html  css  js  c++  java
  • 编译的Ceph二进制文件过大问题

    前言

    在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
  • 相关阅读:
    2019.6.15刷题统计
    入门组完成情况
    2019.6.14刷题统计
    2019.6.13刷题统计
    绑定与非绑定方法 继承 继承与抽象 查找属性关系 派生与覆盖 访问父类的内容
    23 xml 面向对象
    day22 configparser模块 subprocsee模块 表格
    Python常用模块
    20.logging日志 re正则
    导入模块 包
  • 原文地址:https://www.cnblogs.com/zphj1987/p/13575415.html
Copyright © 2011-2022 走看看