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

 

There are 37 section headers, starting at offset 0x27f2868:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .reset            PROGBITS        00000000 010000 0010c0 00  AX  0   0 16
  [ 2] .bootimage_func   PROGBITS        000010c0 5d0000 000000 00   W  0   0  1
  [ 3] .power_sleep_func PROGBITS        000010c0 5d0000 000000 00   W  0   0  1
  [ 4] .power_suspend_fu PROGBITS        000010c0 5d0000 000000 00   W  0   0  1
  [ 5] .init             PROGBITS        000010c0 0110c0 000018 00  AX  0   0  4
  [ 6] .text             PROGBITS        000010d8 0110d8 4644ec 00  AX  0   0  4
  [ 7] .init.text        PROGBITS        004655c4 4755c4 0000c0 00  AX  0   0  4
  [ 8] .fini             PROGBITS        00465684 475684 000018 00  AX  0   0  4
  [ 9] .rodata           PROGBITS        004656a0 4756a0 0d9ed0 00   A  0   0  8
  [10] .ARM.extab        PROGBITS        0053f570 54f570 0097e8 00   A  0   0  4
  [11] .ARM.exidx        ARM_EXIDX       00548d58 558d58 0197f8 00  AL  6   0  4
  [12] .eh_frame         PROGBITS        00562550 572550 000048 00   A  0   0  4
  [13] .init_array       INIT_ARRAY      00562598 572598 000020 00  WA  0   0  4
  [14] .fini_array       FINI_ARRAY      005625b8 5725b8 000004 00  WA  0   0  4
  [15] .jcr              PROGBITS        005625bc 5725bc 000004 00  WA  0   0  4
  [16] .data             PROGBITS        005625c0 5725c0 0596e8 00  WA  0   0  8
  [17] .tlb              PROGBITS        005bbca8 5cbca8 004358 00  WA  0   0  4
  [18] .bss              NOBITS          005c0000 5d0000 d772e0 00  WA  0   0 32
  [19] .mmap             PROGBITS        013372e0 5d0000 000000 00   W  0   0  1
  [20] .stack            NOBITS          013372e0 5d0000 004400 00  WA  0   0  1
  [21] .reserved         NOBITS          0133b6e0 5d0000 040040 00  WA  0   0  1
  [22] .heap             PROGBITS        0137b720 5d0000 000000 00   W  0   0  1
  [23] .comment          PROGBITS        00000000 5d0000 000058 01  MS  0   0  1
  [24] .debug_aranges    PROGBITS        00000000 5d0058 036708 00      0   0  8
  [25] .debug_info       PROGBITS        00000000 606760 f1979f 00      0   0  1

 

  

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/

How to remove unused C/C++ symbols with GCC and ld?

 

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

 

 

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

 

testlib.cpp:

#include "testlib.h"


void MyFile::TestLibA()
{
▸   cout<<"In MyFile::TestLibA()"<<endl;
}

int my_add(int x,int y)
{
▸   return x+y;
}

 testlib.h

#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

#include "testlib.h"

int main()
{
▸   MyFile::TestLib();

▸   return 0;
}

 libtestlib.a的编译:

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

 

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

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$ 

 

 

编译为动态库的方法:

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$ 

 

注意:

1、对于代码中未使用到的全局变量,该选项生成的elf文件中,bss段还是会占用内存空间。实例(注意观察bss段的size大小):

main.c中加入char g_ttt[5*1024*1024];全局变量之前:

There are 37 section headers, starting at offset 0x27f2820:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .reset            PROGBITS        00000000 010000 0010c0 00  AX  0   0 16
  [ 2] .bootimage_func   PROGBITS        000010c0 5d0000 000000 00   W  0   0  1
  [ 3] .power_sleep_func PROGBITS        000010c0 5d0000 000000 00   W  0   0  1
  [ 4] .power_suspend_fu PROGBITS        000010c0 5d0000 000000 00   W  0   0  1
  [ 5] .init             PROGBITS        000010c0 0110c0 000018 00  AX  0   0  4
  [ 6] .text             PROGBITS        000010d8 0110d8 4644ec 00  AX  0   0  4
  [ 7] .init.text        PROGBITS        004655c4 4755c4 0000c0 00  AX  0   0  4
  [ 8] .fini             PROGBITS        00465684 475684 000018 00  AX  0   0  4
  [ 9] .rodata           PROGBITS        004656a0 4756a0 0d9ed0 00   A  0   0  8
  [10] .ARM.extab        PROGBITS        0053f570 54f570 0097e8 00   A  0   0  4
  [11] .ARM.exidx        ARM_EXIDX       00548d58 558d58 0197f8 00  AL  6   0  4
  [12] .eh_frame         PROGBITS        00562550 572550 000048 00   A  0   0  4
  [13] .init_array       INIT_ARRAY      00562598 572598 000020 00  WA  0   0  4
  [14] .fini_array       FINI_ARRAY      005625b8 5725b8 000004 00  WA  0   0  4
  [15] .jcr              PROGBITS        005625bc 5725bc 000004 00  WA  0   0  4
  [16] .data             PROGBITS        005625c0 5725c0 0596e8 00  WA  0   0  8
  [17] .tlb              PROGBITS        005bbca8 5cbca8 004358 00  WA  0   0  4
  [18] .bss              NOBITS          005c0000 5d0000 8772e0 00  WA  0   0 32
  [19] .mmap             PROGBITS        00e372e0 5d0000 000000 00   W  0   0  1
  [20] .stack            NOBITS          00e372e0 5d0000 004400 00  WA  0   0  1

 

加入之后:

 

 

 

aa

posted @ 2014-05-29 17:13  静之深  阅读(5510)  评论(0编辑  收藏  举报