请阅读【ARM GCC 编译专栏导读】
上篇文章:ARM 嵌入式 编译系列 9-- GCC 编译符号表(Symbol Table)的详细介绍
下篇文章:ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小
GCC 如何缩减可执行文件size
在开发过程总,总是希望编译出来的可执行文件尽量小,因为这样可以节省更多的磁盘空间,那么有什么方法可以缩小可执行文件的大小的?
A: 通常我们会首先移除了debug信息,移除了符号表信息,同时我们还希望万一出事了,比如coredump了,我们能获取更多的信息。
Linux下是怎么解决这个矛盾的呢?
先看第一个问题,移除debug相关信息的影响。
测试代码
如下实现了测试代码,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 版本来,然后我们看到可执行程序的大小为 17464
bytes.文章来源:https://www.toymoban.com/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 信息:文章来源地址https://www.toymoban.com/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 编译缩减可执行文件 elf 文件大小】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!