首页 > 代码库 > -ffunction-sections -Wl,--gc-sections

-ffunction-sections -Wl,--gc-sections

AVR/GCC设置不链接未调用的函数

http://blog.csdn.net/shevsten/article/details/7049688

 

在AVR Studio4/5的AVR/GCC默认设置下,未调用的函数也会被link进最终的镜像,从而增大image的大小,这会浪费flash资源.
以下是如何在AVR Studio4/5设置,不把未调用的函数link进image.
方法是在complier命令中增加-ffunction-sections,linker命令中增加-Wl,--gc-sections.
-ffunction-sections:不用此参数时,.o里代码部分只有.text段;使用此参数,则会使每个函数单独成为一段,比如函数func1()成为.text.func1段,但对链接后代码大小没影响。
--gc-sections:这是avr-ld的参数,通过-Wl,<option>由gcc把option里的参数传递给avr-ld。它使得链接器ld链接时删除不用的段。
这样,因为每个函数自成一段(即可以看作函数=段),如果有某个函数未被任何函数/段调用,则ld不会链接它。

AVR Studio 4:
Edit Configuration Options – Custom Options – [All Files] – add -ffunction-sections
                                                                                   – [Linker Options] – add -Wl,--gc-sections

 

 

gcc的-ffunction-sections和-fdata-sections选项与ld的--gc-sections选项

http://songzhangzhang.blog.163.com/blog/static/69401981201141321641323/

 

g++: error: unrecognized option ‘--gc-sections’

 

 

注意:若不添加这些选项的话,则默认是不链接未调用的函数的

 

testlib.cpp:

?
1
2
3
4
5
6
7
8
9
10
11
12
#include "testlib.h"
 
 
void MyFile::TestLibA()
{
?   cout<<"In MyFile::TestLibA()"<<endl;
}
 
int my_add(int x,int y)
{
?   return x+y;
}

 testlib.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdlib.h>
#include <iostream>
using namespace std;
 
class MyFile
{
?   public:
?   ?   static void TestLib()
?   ?   {
?   ?   ?   cout<<"In MyFile::TestLib()"<<endl;
?   ?   }
 
?   ?   void TestLibA();
};
 
 
int my_add(int x,int y);

 main.cpp

?
1
2
3
4
5
6
7
8
#include "testlib.h"
 
int main()
{
?   MyFile::TestLib();
 
?   return 0;
}

 libtestlib.a的编译:

?
1
g++ -c -ffunction-sections -fdata-sections testlib.cpp<br>yingc@yingc:~/gcyin/test/tmp/csdn$ !ar<br>ar crv libtestlib.a testlib.o<br>a - testlib.o

 

g++ -c -ffunction-sections -fdata-sections main.cpp

?
1
2
3
4
5
6
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -Wl,--gc-sections  main.o -L. -ltestlib -static -o main
yingc@yingc:~/gcyin/test/tmp/csdn$ !nm
nm libtestlib.a | grep my_add
00000000 T _Z6my_addii
yingc@yingc:~/gcyin/test/tmp/csdn$ nm main | grep my_add
yingc@yingc:~/gcyin/test/tmp/csdn$

 

 

编译为动态库的方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -shared -fPIC -o libtestlib.so testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ vim main.cpp
  
[1]+  Stopped                 vim main.cpp
yingc@yingc:~/gcyin/test/tmp/csdn$
yingc@yingc:~/gcyin/test/tmp/csdn$
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ gcc -c main.cpp
yingc@yingc:~/gcyin/test/tmp/csdn$ ll
total 48
drwxrwxr-x  2 yingc yingc  4096  5月 28 10:49 ./
drwxrwxr-x 17 yingc yingc  4096  5月 28 10:32 ../
-rwxrwxr-x  1 yingc yingc  6990  5月 28 10:48 libtestlib.so*
-rw-rw-r--  1 yingc yingc   520  5月 28 10:49 main.cpp
-rw-r--r--  1 yingc yingc 12288  5月 28 10:49 .main.cpp.swp
-rw-rw-r--  1 yingc yingc  2176  5月 28 10:49 main.o
-rw-rw-r--  1 yingc yingc   546  5月 28 10:48 testlib.cpp
-rw-rw-r--  1 yingc yingc   635  5月 28 10:47 testlib.h
-rw-rw-r--  1 yingc yingc  1448  5月 28 10:38 testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -o main main.o -L. -ltestlib
yingc@yingc:~/gcyin/test/tmp/csdn$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x02a9f9e7e9c76d2c9b277aff913bf5387a8d7f8d, not stripped
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main  main.cpp  main.o  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ./main
In MyFile::TestLib()
yingc@yingc:~/gcyin/test/tmp/csdn$