-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
-ffunction-sections -Wl,--gc-sections的更多相关文章
- 史上最简洁的UITableView Sections 展示包含NSDicionary 的NSArray
这个最典型的就是电话本,然后根据A-Z分组, 当然很多例子,不过现在发现一个很简洁易懂的: 1. 准备数据,定义一个dictionary来显示所有的内容,这个dictionary对应的value全是数 ...
- Linker scripts之SECTIONS
1 Purpose The linker script describes how the sections in the input files should be mapped into the ...
- 链接脚本(Linker Script)用法解析(一) 关键字SECTIONS与MEMORY
1.MEMORY关键字用于描述一个MCU ROM和RAM的内存地址分布(Memory Map),MEMORY中所做的内存描述主要用于SECTIONS中LMA和VMA的定义. 2.SECTIONS关键字 ...
- 【小丸类库系列】Word操作类
using Microsoft.Office.Interop.Word; using System; using System.Collections.Generic; using System.Dr ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- uboot makefile构建分析-续
前言 这篇博文是 uboot makefile构建分析的续篇,继续分析uboot构建u-boot.bin的过程 构建u-boot.bin过程分析 makefile一开始,就是确定链接脚本.在构建ubo ...
- MySqlDBHelper数据库连接
这里是本人在工作中用到,希望给大家帮助 public class MySqlDBHelper { //获取一个记录器 private static readonly log4net.ILog log ...
- Linux平台Makefile文件的编写基础篇
目的: 基本掌握了 make 的用法,能在Linux系统上编程. 环境: Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境. 准备: ...
- make的使用和Makefile规则和编程及其基本命令(简单)
转自:http://blog.chinaunix.net/uid-23929712-id-2650328.html 概述: make从Makefile中文件中获取模块间的依赖关系,判断哪些文件 ...
- C# 合并及拆分Word文档
本文简要分析一下如何如何使用C#简单实现合并和拆分word文档.平时我们在处理多个word文档时,可能会想要将两个文档合并为一个,或者是将某个文档的一部分添加到另一个文档中,有的时候也会想要将文档拆分 ...
随机推荐
- 慎把“DataContext”静态化 或则单例
之前在项目里由于把DataContext静态化,最后在测试阶段发现了很多奇怪的问题,后来经过同事的指点 然后上网搜了一翻终于发现 MSDN上说: "请不要试图重用 DataContext ...
- 54.xilinx_modelsim仿真错误1
在仿真DDR3核时,用modelsim编译时会出现下面错误 Error:can't read "env(XILINX)":no such variable 原因:在.do文件中指定 ...
- Ubuntu 关闭锁屏界面的 on-screen keyboard
试了试屏幕键盘,在 系统设置里开启了,又关了,但是在屏幕解锁时总是出现 screen keyboard,老烦人了,不知到在哪里关闭了,系统设置里面都关了,网上搜了解决办法,原来在这里 把 show w ...
- String、StringBuilder、StringBuffer
String String ...
- Python2.x与3.x版本区别
Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级. 为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容 ...
- 快逸报表部署 (一)-- demo连接mysql数据库
1. 设计器连接mysql数据库, 创建first.raq报表文件 2. 创建demo.jsp,嵌入报表,jsp顶部加入下面两行 <%@ page contentType="text/ ...
- 网页数据采集 - 系列之Flash数据采集
经常看到一些朋友在讨论如何采集flash中的数据,讨论来讨论区,结论就是:flash不能采集,其实也不总是这样.本篇就跟大家分享如何采集flash中的数据. 在开始之前,先说明一下:一般来说flash ...
- 华为HG8240光猫-破解-联通-2016-telnet-http
序 我与大家想法基本一致,拿到联通的光猫后,心想它应该是个路由器吧,如果让它自己拨号上网就好了,即省一台路由器,又省电了.抱着这个想法,在2013年里,我搜罗了不少文章,经过Q群,搜索,询问,阅读,理 ...
- sourceInsight使用技巧,持续更新中~~~
作为测试人员,读各种平台的工程代码时,根本不想安装各种vs或者eclipse等,于是,就找了一款代码阅读工具. sourceInsight,下载地址为官网:http://www.sourceinsig ...
- Java多jdk安装
1.安装jdk 2.配置 1.安装(略) 2.配置 2.1 regedit 注册表修改,假定已经安装jdk1.6,现在更换为jdk1.7 注: 修改红色框中CurrentVersion为jdk1.7 ...