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

-ffunction-sections -Wl,--gc-sections的更多相关文章

  1. 史上最简洁的UITableView Sections 展示包含NSDicionary 的NSArray

    这个最典型的就是电话本,然后根据A-Z分组, 当然很多例子,不过现在发现一个很简洁易懂的: 1. 准备数据,定义一个dictionary来显示所有的内容,这个dictionary对应的value全是数 ...

  2. Linker scripts之SECTIONS

    1 Purpose The linker script describes how the sections in the input files should be mapped into the ...

  3. 链接脚本(Linker Script)用法解析(一) 关键字SECTIONS与MEMORY

    1.MEMORY关键字用于描述一个MCU ROM和RAM的内存地址分布(Memory Map),MEMORY中所做的内存描述主要用于SECTIONS中LMA和VMA的定义. 2.SECTIONS关键字 ...

  4. 【小丸类库系列】Word操作类

    using Microsoft.Office.Interop.Word; using System; using System.Collections.Generic; using System.Dr ...

  5. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  6. uboot makefile构建分析-续

    前言 这篇博文是 uboot makefile构建分析的续篇,继续分析uboot构建u-boot.bin的过程 构建u-boot.bin过程分析 makefile一开始,就是确定链接脚本.在构建ubo ...

  7. MySqlDBHelper数据库连接

    这里是本人在工作中用到,希望给大家帮助 public class MySqlDBHelper { //获取一个记录器 private static readonly log4net.ILog log ...

  8. Linux平台Makefile文件的编写基础篇

    目的:        基本掌握了 make 的用法,能在Linux系统上编程. 环境:        Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境. 准备: ...

  9. make的使用和Makefile规则和编程及其基本命令(简单)

      转自:http://blog.chinaunix.net/uid-23929712-id-2650328.html   概述: make从Makefile中文件中获取模块间的依赖关系,判断哪些文件 ...

  10. C# 合并及拆分Word文档

    本文简要分析一下如何如何使用C#简单实现合并和拆分word文档.平时我们在处理多个word文档时,可能会想要将两个文档合并为一个,或者是将某个文档的一部分添加到另一个文档中,有的时候也会想要将文档拆分 ...

随机推荐

  1. [quote ]ffmpeg, gstreamer, Raspberry Pi, Windows Desktop streaming

    [quote ]ffmpeg, gstreamer, Raspberry Pi, Windows Desktop streaming http://blog.pi3g.com/2013/08/ffmp ...

  2. Mysql中将查询出来的多列的值用逗号拼接

    select group_concat(字段名) from 表名

  3. < java.lang >-- StringBuffer字符串缓冲区

    构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符. 特点: 1:可以对字符串内容进行修改. 2:是一个容器. 3:是可变长度的. 4:缓冲区中可以存储任意类型的数据. 5:最终需要变成字符 ...

  4. 微信小程序购物商城系统开发系列

    微信小程序购物商城系统开发系列 微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统. ...

  5. c++中-1是true呢还是false呢

    今天想看一下引用c++中的,然后看到网上有问c++中-1是true or false呢?用vc6.0是了一下,是true.vc6.0中应该是非0的都是true,0为false.java我也试了一下,i ...

  6. 团队小组开发nabc分析

    我们团队开发的项目为:牛逼的手电筒 NABC模型: 1.N:现在每个人几乎走哪,干什么都会拿着手机,而现在年轻人晚上在外面的也不少,所以手机里安装一个手电筒的APP还是很有必要的. 2.A:这学期正在 ...

  7. pcxFirefox 自定义

    便携特性(ini设置)     把与firefox.exe同文件夹的tmemutil-sample.ini 改名为tmemutil.ini,设置如下: Portable=1 #便携式 Portable ...

  8. 第五周&第六周

    学习进度表  周数 专业学习目标 学习时间 新增代码行 博客发表量 人文方面学习 知识总结 第四周 认真掌握老师上课所讲的内容,在课外多学习一些知识    5小时 50          1   阅读 ...

  9. Codeforces Round #131 (Div. 2) E. Relay Race dp

    题目链接: http://codeforces.com/problemset/problem/214/E Relay Race time limit per test4 secondsmemory l ...

  10. Noip模拟考第三题——饥饿游戏

    饥饿游戏 (hungry.pas/c/cpp) [问题描述] Chanxer饿了,但是囊中羞涩,于是他去参加号称免费吃到饱的“饥饿游戏”. 这个游戏的规则是这样的,举办者会摆出一排 个食物,希望你能够 ...