armcomplier5中怎样将c中没有调用的函数优化掉

在 Makefile 中实现"移除未调用函数"的功能,关键在于分别给 编译规则(生成 .o 文件时)和 链接规则(生成 .axf 文件时)添加对应的参数。

基于 ARM Compiler 5 (armcc/armlink),你需要添加的核心参数是 --split_sections(编译时)和 --remove(链接时)。

以下是具体的修改方法和完整的 Makefile 示例:

🛠️ 核心修改点

你需要修改 Makefile 中的变量定义和规则部分:

  1. 编译阶段 (armcc):

* 在 CFLAGS(编译选项)中加入 --split_sections。

* 作用:让每个函数都单独存放在一个独立的段中。

  1. 链接阶段 (armlink):

* 在 LFLAGS 或 LINKFLAGS(链接选项)中加入 --remove。

* 作用:让链接器自动剔除未被引用的段。

📝 完整的 Makefile 示例

你可以直接参考或复制以下模板,重点关注注释标记的部分:

工具链定义

CC = armcc

ARMLINK = armlink

FROMELF = fromelf

优化与编译选项配置

基础配置

CPU = --cpu=Cortex-M4

建议开启 -O2 或 -O3 优化,配合死代码消除效果更好

OPT = -O2

【关键点1】编译选项

添加 --split_sections,确保每个函数独立成段

CFLAGS = (CPU) (OPT) --split_sections -c

链接选项配置

【关键点2】链接选项

添加 --remove,指示链接器移除未使用的段

LFLAGS = --remove --scatter=scatter.sct

源文件与目标文件

SRC = main.c driver.c utils.c

OBJ = (SRC:.c=.o)

TARGET = app.axf

构建规则

all: (TARGET)

编译规则:生成 .o 文件

%.o: %.c

@echo Compiling <...

(CC) (CFLAGS) < -o @

链接规则:生成 .axf 文件

(TARGET): (OBJ)

@echo Linking...

(ARMLINK) (LFLAGS) (OBJ) -o @

可选:生成 bin 文件

(FROMELF) --bin -o (TARGET:.axf=.bin) @

清理规则

clean:

rm -f (OBJ) (TARGET) $(TARGET:.axf=.bin)

.PHONY: all clean

💡 进阶技巧:配合 LTO 获得极致优化

如果你希望进一步优化,甚至跨文件内联并消除未调用的静态函数,可以开启 链接时优化。

在 Makefile 中同时加入 -flto 标志:

在 CFLAGS 和 LFLAGS 中都加上 -flto

CFLAGS += -flto

LFLAGS += -flto

效果对比:

* 仅 --split_sections + --remove:只能移除外部可见但未调用的函数(例如你在 utils.c 写了函数但在 main.c 没用到)。

* 加上 -flto:编译器能看到整个工程的全貌,连静态 (static) 但未调用的函数也能被识别并移除,且能进行跨文件内联优化。

⚠️ 避坑指南

在使用 --remove 时,如果你的代码中使用了函数指针(例如回调函数、状态机跳转),编译器可能无法静态分析出这些函数被"调用"了,从而导致它们被误删。

解决方法:

  1. 使用 attribute((used)):在函数定义前加上这个属性,强制保留。

void my_callback(void) attribute((used));

void my_callback(void) { ... }

  1. 或者在链接器选项中强制保留:

在 LFLAGS 中添加 --keep='*.o(my_callback)'。

相关推荐
智者知已应修善业6 小时前
【4060BD_5V应用电路图】2022-12-24
驱动开发·经验分享·笔记·硬件架构·硬件工程
tang_04279 小时前
【Hi.Ltd 专题】第9期:Interop 配置互操作(JSON/INI/XML/YAML/注册表/扫码)
经验分享·c#·hi.ltd系列
Regentsoft丽晶软件10 小时前
即时零售退货的库存归属、质检标准和退款时效,系统如何做到自动闭环
大数据·经验分享·数据库架构
2601_9653842611 小时前
口腔黏膜清洁的工程化路径:从表面形貌表征到清洁策略匹配
经验分享·笔记
2401_8501220413 小时前
航空、轨交、汽车线束防护有什么不同?三大行业的共性、差异与选型逻辑
经验分享·笔记·科技
tang_042715 小时前
【Hi.Ltd 专题】第7期:Threading 采集线程、锁与 LRU 缓存
经验分享·c#·hi.ltd系列
人效思维笔记15 小时前
阿米巴推行前,经营者要先做好哪些准备?
经验分享·笔记·阿米巴·阿米巴经营·中国式阿米巴
hongyangcao16 小时前
12.8万科技岗位被“重组“,预算流向了算力
人工智能·经验分享·ai编程
总线通信小百科18 小时前
汽车也能像手机一样远程升级?车载OTA原理解析
经验分享
tang_042718 小时前
【Hi.Ltd 专题】第8期:Managements 插件、单例与服务定位
经验分享·c#·hi.ltd系列