编译的Ceph二进制文件过大问题
在ceph的研发群里看到一个cepher提出一个问题,编译的ceph的二进制文件过大,因为我一直用的打包好的rpm包,没有关注这个问题,重新编译了一遍发现确实有这个问题
本篇就是记录如何解决这个问题的
打rpm包的方式
用我自己的环境编译的时候发现一个问题,编译出来的rpm包还是很大,开始怀疑是机器的原因,换了一台发现二进制包就很小了,然后查询了很多资料以后,找到了问题所在
在打rpm包的时候可以通过宏变量去控制是否打出一个的debug的包,这个包的作用就是把二进制文件当中包含的debug的相关的全部抽离出来形成一个新的rpm包,而我的环境不知道什么时候在/root/.rpmmacros添加进去了一个
d%ebug_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内容清理掉,这样就可以得到比较小的二进制包了
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C# dotnet 使用 startIndex 提升 IndexOf 的性能
- vscode .vue文件格式配置 使其与webstorm设置一致
- Go 语言学习之 slice
- koa2实现微信公众号关注自动回复消息
- 两个字数字字符串求和
- 设计模式(二):Android 源码中的工厂模式
- MoveIt!之ROS1Melodic版本发布(MoveItCpp教程)
- 机器学习第1天:线性回归(代码篇)
- PHP二分查找
- OnClick 的另一种书写
- JVM系列之:JIT中的Virtual Call
- 速读原著-UnixLinux基础(五)
- Celery在Django中的简单应用
- 基于数据库Binlog 的业务系统操作日志实现方案(阿里中间件Canal)
- 速读原著-UnixLinux基础(三)