zoukankan      html  css  js  c++  java
  • -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

  • 相关阅读:
    【HDU4676】Sum Of Gcd(莫队+欧拉函数)
    【BZOJ5084】hashit(后缀自动机水过)
    【HHHOJ】ZJOI2019模拟赛(十三)03.10 解题报告
    【BZOJ2127】happiness(网络流)
    【CCPC-Wannafly Winter Camp Day4 (Div1) J】跑跑跑路(爬山算法)
    【CCPC-Wannafly Winter Camp Day4 (Div1) H】命命命运(概率DP)
    2019.03.09 ZJOI2019模拟赛 解题报告
    关闭Android/iPhone浏览器自动识别数字为电话号码
    border-radius 在安卓手机竟然不完美支持
    validate.plugin.js 验证插件
  • 原文地址:https://www.cnblogs.com/jingzhishen/p/3759584.html
Copyright © 2011-2022 走看看