Re: [問題] 如何縮小exe檔案的大小

看板C_and_CPP作者 (好人超)時間15年前 (2010/01/19 20:44), 編輯推噓9(9020)
留言29則, 5人參與, 最新討論串2/2 (看更多)

01/20 02:01,
V大說的binary就exe嚕? 那到底是global還是全部變數給初值都
01/20 02:01

01/20 02:01,
會有影響呢? 感覺全部都會有耶
01/20 02:01
做了一個簡單的實驗: 試著把一個 int array 放在不同的地方,並且嘗試是否給予初始值 在編譯後,以 objdump 觀察 ELF section (text, data, bss) 的大小改變 ==== 程式碼 ==== #include <stdio.h> (1)int arr[1024]; (2)int arr[1024] = {1, 2, 3, 4, 5}; int main() { (3)int arr[1024]; (4)int arr[1024] = {1, 2, 3, 4, 5}; } ==== 測試環境 ==== OS : Linux Ubuntu 9.04 + gcc 4.3.3 編譯參數:gcc test.c 結果觀察:objdump -x a.out ==== 測試結果 ==== text data bss 執行檔大小 (以 ls -al a.out 得到,十進位,單位 byte) (0) 0x16C 0x08 0x08 9112 (沒有宣告任何變數,對照組) (1) 0x16C 0x08 0x1020 9132 (未給初值的 global int[] ) (2) 0x16C 0x1020 0x08 13276 (有給初值的 global int[] ) (3) 0x17C 0x08 0x08 9112 (未給初值的 local int[] ) (4) 0x1EC 0x08 0x08 9112 (有給初值的 local int[] ) (註:local static variable 的結果與 global variable 相同) ==== 結論 ==== 1. 未給初值的 global variable 會增加 bss section 2. 有給初值的 global variable 會增加 data section 3. 未給初值的 local variable 似乎不會佔用任何額外空間 (對執行檔來說) 4. 有給初值的 local variable 會增加 text section 想必是用來初始化的額外程式碼,但卻不會增加執行檔的大小 5. 如果陣列的初始值為 {0},則與 2. 相同 6. 陣列的初始值數量增減(譬如改成 {1, 2, 3, 4, 5, 6, 7} 或 {1}) 會影響 local variable 的 text section 大小,但 global 則沒有影響 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.127.184.214

01/20 04:48, , 1F
(3) 0x17C 0x08 0x08 9112 (未給初值的 local in
01/20 04:48, 1F

01/20 04:49, , 2F
^^^^^ 跟上面的 0x16C 有點不一樣喔QQ"
01/20 04:49, 2F
因為它真的改變了 XD 我也不知道為什麼... ※ 編輯: james732 來自: 59.127.184.214 (01/20 04:58) ※ 編輯: james732 來自: 59.127.184.214 (01/20 06:05)

01/20 06:53, , 3F
我猜是將 sp 移開做出 local variable 空間的程式...
01/20 06:53, 3F

01/20 06:53, , 4F
(喔我是說 0x16C 和 0x17C 的差別)
01/20 06:53, 4F

01/20 06:53, , 5F
(記得好像 objdump 可以 dump 出 assembly 出來?)
01/20 06:53, 5F

01/20 10:01, , 6F
(4) 的結果出乎小弟的意料說, 有空測試研究一下好了orz
01/20 10:01, 6F

01/20 10:06, , 7F
剛用VC試了一下, local的init是在執行時直接一個一個用
01/20 10:06, 7F

01/20 10:07, , 8F
mov inst.搬的, 所以只給{1, 2, 3, 4, 5}的情況下只需要
01/20 10:07, 8F

01/20 10:08, , 9F
多5條inst. 多給些初值binary就會變大了; 只是和global
01/20 10:08, 9F

01/20 10:08, , 10F
增加size的地方不太一樣就是了XD
01/20 10:08, 10F

01/20 13:28, , 11F
V大 vc怎麼看 組語阿??
01/20 13:28, 11F

01/20 13:35, , 12F
可以在編譯時輸出組合語言檔 或者用反組譯工具
01/20 13:35, 12F

01/20 13:37, , 13F
Linux 下 gcc -S 可輸出組語檔 而 objdump 可反組譯
01/20 13:37, 13F

01/20 13:39, , 14F
是在project property那邊設定嗎@@ 會的太少了...
01/20 13:39, 14F

01/20 13:46, , 15F
VC拉組語看很簡單, break point斷下來, Debug->Windows
01/20 13:46, 15F

01/20 13:46, , 16F
裡就有Disasm的選項可以拉出來看了:)
01/20 13:46, 16F

01/20 13:47, , 17F

01/20 13:50, , 18F
j大動作好快XD PS. 這是偷懶直接掛debug的作法, 程式要
01/20 13:50, 18F

01/20 13:51, , 19F
執行起來才能用; 要完整的asm code還是要照j大上面說的.
01/20 13:51, 19F

01/20 13:51, , 20F
謝謝vj大的資訊= = 謝謝
01/20 13:51, 20F

01/20 13:53, , 21F
V大說的跟J大有甚麼不同 我設中斷點看組語照V大說的做阿
01/20 13:53, 21F

01/20 13:54, , 22F
什麼是偷懶@@ 還有也可以看到全部不是嗎~
01/20 13:54, 22F

01/20 13:58, , 23F
我說的就是j大附圖的方式, 這是step by step debug時即
01/20 13:58, 23F

01/20 13:59, , 24F
時看asm用的; 另外有些工具或者編譯選項是直接產生asm
01/20 13:59, 24F

01/20 13:59, , 25F
code出來, 那就不用掛著debugger看了; 只是, 直接K asm
01/20 13:59, 25F

01/20 13:59, , 26F
code可能也不見得比掛debugger看容易就是了....XD
01/20 13:59, 26F

01/20 14:37, , 27F
喔喔 那VC沒有選項可以勾起來 順便輸出asm嗎
01/20 14:37, 27F

01/20 14:47, , 29F
應該就是這個了
01/20 14:47, 29F
文章代碼(AID): #1BLXcixP (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BLXcixP (C_and_CPP)