請閱讀【ARM GCC 編譯專欄導讀】
上篇文章:ARM 嵌入式 編譯系列 9-- GCC 編譯符號表(Symbol Table)的詳細介紹
下篇文章:ARM 嵌入式 編譯系列 10.1 – GCC 編譯縮減可執(zhí)行文件 elf 文件大小
GCC 如何縮減可執(zhí)行文件size
在開發(fā)過程總,總是希望編譯出來的可執(zhí)行文件盡量小,因為這樣可以節(jié)省更多的磁盤空間,那么有什么方法可以縮小可執(zhí)行文件的大小的?
A: 通常我們會首先移除了debug信息,移除了符號表信息,同時我們還希望萬一出事了,比如coredump了,我們能獲取更多的信息。
Linux下是怎么解決這個矛盾的呢?
先看第一個問題,移除debug相關信息的影響。
測試代碼
如下實現(xiàn)了測試代碼,main
調用了 foo
,foo
調用了 bar
,其中bar
故意訪問了非法地址,為了引起 core dump
。
#include<stdio.h>
#include<stdlib.h>
static int bar(void)
{
char *p = NULL;
printf("I am bar,I will core dump\n");
printf("%s",p);
*p =0x0;
return 0;
}
static int foo(void)
{
int i ;
printf("I am foo,I will call bar\n");
bar();
return 0;
}
int main(void)
{
printf("I am main, I wll can foo\n");
foo();
return 0;
}
先編譯出一個 debug 版本來,然后我們看到可執(zhí)行程序的大小為 17464
bytes.文章來源:http://www.zghlxwxcb.cn/news/detail-698543.html
gcc -g test.c -o test
ls -rtl test
-rwxrwxr-x 1 codingcos codingcos 17464 8月 14 09:43 test
再看下 section 信息:文章來源地址http://www.zghlxwxcb.cn/news/detail-698543.html
readelf -S test
There are 37 section headers, starting at offset 0x3af8:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000000318 00000318
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.gnu.pr[...] NOTE 0000000000000338 00000338
0000000000000030 0000000000000000 A 0 0 8
[ 3] .note.gnu.bu[...] NOTE 0000000000000368 00000368
0000000000000024 0000000000000000 A 0 0<
到了這里,關于【ARM 嵌入式 編譯系列 10 -- GCC 編譯縮減可執(zhí)行文件 elf 文件大小】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!