在ceph的研發群裡看到乙個cepher提出乙個問題,編譯的ceph的二進位制檔案過大,因為我一直用的打包好的rpm包,沒有關注這個問題,重新編譯了一遍發現確實有這個問題
本篇就是記錄如何解決這個問題的
用我自己的環境編譯的時候發現乙個問題,編譯出來的rpm包還是很大,開始懷疑是機器的原因,換了一台發現二進位製包就很小了,然後查詢了很多資料以後,找到了問題所在
在打rpm包的時候可以通過巨集變數去控制是否打出乙個的debug的包,這個包的作用就是把二進位制檔案當中包含的debug的相關的全部抽離出來形成乙個新的rpm包,而我的環境不知道什麼時候在/root/.rpmmacros新增進去了乙個
%debug_package %
搜尋資料後確定就是這個的問題,這個變數新增了以後,在打包的時候就不會進行debug相關包的剝離,然後打出的包就是巨大的,可以這樣檢查自己的rpmbuild的巨集變數資訊
[root@host1 ceph-10.2.6]# rpmbuild --showrc|grep debug_package
%}-14: _enable_debug_packages 1
-14: debug_package
%global __debug_package 1
-14: install %}}
如果開啟了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
gcc編譯的時候帶上-g引數,就是新增了debug的資訊
gcc -g -o
[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
[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
[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內容清理掉,這樣就可以得到比較小的二進位製包了
whywho
when
建立武漢-運維-磨渣
2017-03-23
編譯Kubelet二進位制檔案
1.環境 系統 centos 7.2 go 1.10.3 kubernetes 1.10.4 2.安裝最新版go 編譯的kubernetes 1.10.4 要求go 版本在1.9.3 以上,使用下面的 yum源安裝最新版go golang name golang baseurl enable 1gp...
二進位制檔案
本質上是文字檔案是把檔案資訊先轉化成以字元編碼的ascii碼,再儲存ascii的二進位制 而二進位制檔案是直接把檔案資訊編碼成二進位制儲存。因此在讀取的時候要考慮記憶體中二進位制 應該怎麼樣解釋。二進位制檔案的讀取是是要告訴元素的型別 編碼方式 文字檔案則預設為char型別。文字檔案是一種特殊的二進...
二進位制檔案
二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...