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

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/

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

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

testlib.cpp:

?





1

2

3

4

5

6

7

8

9

10

11

12

#include "testlib.h"

void
MyFile::TestLibA()

{

?   cout<<"In MyFile::TestLibA()"<<endl;

}

int my_add(int
x,int y)

{

?   return
x+y;

}

testlib.h

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#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

?





1

2

3

4

5

6

7

8

#include "testlib.h"

int main()

{

?   MyFile::TestLib();

?   return
0;

}

libtestlib.a的编译:

?





1

g++ -c -ffunction-sections -fdata-sections testlib.cpp<br>[email protected]:~/gcyin/test/tmp/csdn$ !ar<br>ar crv libtestlib.a testlib.o<br>a - testlib.o

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

?





1

2

3

4

5

6

[email protected]:~/gcyin/test/tmp/csdn$ g++ -Wl,--gc-sections  main.o -L. -ltestlib -static
-o main

[email protected]:~/gcyin/test/tmp/csdn$ !nm

nm libtestlib.a | grep my_add

00000000 T _Z6my_addii

[email protected]:~/gcyin/test/tmp/csdn$ nm main | grep my_add

[email protected]:~/gcyin/test/tmp/csdn$

编译为动态库的方法:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

[email protected]:~/gcyin/test/tmp/csdn$ g++ -shared -fPIC -o libtestlib.so testlib.o

[email protected]:~/gcyin/test/tmp/csdn$ ls

libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o

[email protected]:~/gcyin/test/tmp/csdn$ vim main.cpp

 

[1]+  Stopped                 vim main.cpp

[email protected]:~/gcyin/test/tmp/csdn$

[email protected]:~/gcyin/test/tmp/csdn$

[email protected]:~/gcyin/test/tmp/csdn$ ls

libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o

[email protected]:~/gcyin/test/tmp/csdn$ gcc -c main.cpp

[email protected]:~/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

[email protected]:~/gcyin/test/tmp/csdn$ g++ -o main main.o -L. -ltestlib

[email protected]:~/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

[email protected]:~/gcyin/test/tmp/csdn$ ls

libtestlib.so  main  main.cpp  main.o  testlib.cpp  testlib.h  testlib.o

[email protected]:~/gcyin/test/tmp/csdn$ ./main

In MyFile::TestLib()

[email protected]:~/gcyin/test/tmp/csdn$

-ffunction-sections -Wl,--gc-sections,布布扣,bubuko.com

时间: 2024-10-13 03:05:52

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

Keil5.15使用GCC编译器编译STM32工程

我们使用Keil一般使用ARMCC编译MCU工程代码.其实,Keil也是支持内嵌GCC编译器的.我们可以使用GCC来编译我们的工程代码. 一.下载GCC编译器 GCC编译器下载地址 二.安装GCC 我们可以把GCC解压到keil的安装目录下面.如下图 三.配置Keil使用GCC编译器 1.配置CC编译规则,Misc Controls 填写 -mcpu=cortex-m4 -mthumb -fdata-sections -ffunction-sections 2.Assembler中规则,Misc

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

1 using Microsoft.Office.Interop.Word; 2 using System; 3 using System.Collections.Generic; 4 using System.Drawing; 5 using System.IO; 6 using System.Linq; 7 using System.Reflection; 8 using System.Text.RegularExpressions; 9 10 namespace OtaReportTool

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

转自:http://blog.chinaunix.net/uid-23929712-id-2650328.html 概述: make从Makefile中文件中获取模块间的依赖关系,判断哪些文件已经过时,根据这些信息make确定哪些文件需要重新编译,然后使用Makefile中的编译命令进行编译 make命令参数详解 -C dir:在读取Makefile文件前,先切换到"dir"目录下,也就是把dir作为当前目录 -d     :make执行时打印出所有的调试信息 -e     :不允许在

UVa1588

1588 KickdownA research laboratory of a world-leading automobile company has received an order to create a specialtransmission mechanism, which allows for incredibly efficient kickdown | an operation of switching tolower gear. After several months of

紫书第三章训练2 暴力集

A - Master-Mind Hints MasterMind is a game for two players. One of them, Designer, selects a secret code. The other, Breaker, tries to break it. A code is no more than a row of colored dots. At the beginning of a game, the players agree upon the leng

jade模板

jade 模板使用 npm install jade -g      安装到全局 jade index.jade         导出一个 index.html 压缩后的 jade -P index.jade       导出一个 index.html 没有压缩的 jade -P -w index.jade     -w  对文件实时编译 特殊的div .container p 巧巧 a(href='http://baidu.com', title='巧莉', data-uid='100') i

apache 目录结构

[[email protected] conf]# tree -L 1 ../../├── bin├── build├── cgi-bin├── conf├── error├── htdocs├── icons├── include├── lib├── logs├── man├── manual└── modules 13 directories, 0 files[[email protected] conf]# tree -L 2 ../../├── bin│   ├── ab│   ├──

Ok6410裸机驱动学习(一)开发工具

1.GCC工具链 1.GCC默认处理的文件类型 文件类型 扩展名 文件说明 文本文件 *.c C语言源文件 *.C.*.cxx.*.cc C++源文件 *.i 预处理后的C语言源文件 *.ii 预处理后的C++源文件 *.s.*.S 汇编语言 *.h 头文件 二进制文件 .o 目标文件 .so 动态库 .a 静态库 表1.gcc默认处理的文件类型 GCC是一组工具的集合,包含了预处理器.编译器.汇编器.连接器等部分. 2.编译工具和Binutils GCC的核心是编译工具gcc,用于编译c程序,

《转》linux 使用小技巧

本文介绍了平时累积的Linux使用技巧. 文件的属性 文件的隐藏属性 lsattr : 列出文件的隐藏属性chattr : 修改文件的隐藏属性 [[email protected] ~]# chattr [+-=][ASacdistu] FileName+ : Add one attribute- : Remove one attribute= : Set to be the only attributes that the files have重要选项 a:只能追加文件的内容,但不能修改或删除

github上一款特别的侧滑

知识分享: 首先看图,我只是大自然的搬运工,想实现这种特效的请点击连接下载github地址忘掉了,....http://download.csdn.net/detail/lj419855402/8602281 主要实现代码,利用AS编译. package net.xpece.material.navigationdrawer.sample.ui; import android.annotation.SuppressLint; import android.content.res.Configur