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文档时,可能会想要将两个文档合并为一个,或者是将某个文档的一部分添加到另一个文档中,有的时候也会想要将文档拆分 ...
随机推荐
-
volcanol_Linux_ 问题汇总系列_4_Thinkpad_E40_0578MDC_在Fedora 13 Linux(FC13)中如何安装无线网卡驱动
今天晚上,我突然想在自己到笔记本上安装linux系统,因为我自己第一次接触到的linux是红帽支持到Fedora Core 4,所以一直最中意的linux 发行版本是FC系列,同时由于FC 15以后到 ...
-
Linux中RM快速删除大量文件/文件夹方法
昨天遇到一个问题,在Linux中有一个文件夹里面含有大量的Cache文件(夹),数量级可能在百万级别,使用rm -rf ./* 删除时间慢到不可接受.Google了一下,查到了一种方法,试用了下确实比 ...
-
Java foreach操作(遍历)数组
语法: 我们分别使用 for 和 foreach 语句来遍历数组 运行结果: 练习: import java.util.Arrays; public class HelloWorld { public ...
-
PH获取当前url路径及服务器路径汇总 (url 获取当前路径 服务器路径)
以下是整理的一些, php中获取路径的小知识, 希望对你有所帮助! 1,$_SERVER["QUERY_STRING"] 说明:查询(query)的字符串 2,$_SERVER[& ...
-
VM 443端口冲突解决办法
netstat -aon|findstr "443" 找到占用443的进程号: tasklist|findstr "2016" 根据进程号2016找到占用443 ...
-
Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
-
Java 诊断工具 Arthas 教程学习笔记
Java 诊断利器 Arthas,是阿里的一款开源工具.Github-alibaba/arthas 上可以看到它的介绍.了解它,主要是最近对分析 Java 错误堆栈比较感兴趣,机缘巧合看到了它. 本文 ...
-
springboot swagger2 泛型踩坑记
最近使用一些工具需要和swagger打通,swagger的格式总是不对. 后来查了一下:哈哈. https://blog.csdn.net/hupingjin/article/details/8299 ...
-
Ex3_15 判断图是否是一个强连通分量 判断点是否在汇点强连通分量中_十一次作业
(a) 可以用图中的每一个顶点表示街道中的每个十字路口,由于街道都是单行的,所以图是有向图,若从一个十字路口都有一条合法的路线到另一个十字路口,则图是一个强连通图.即要验证的是图是否是一个强连通图. ...
-
01c++学习
#include"iostream" using namespace std; void main01() { //printf("hello_world\n" ...