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)'。

相关推荐
聪明的笨猪猪5 小时前
企业知识库AI架构选型:落地导向的架构决策与组件清单
经验分享·面试·架构·embedding·数据库架构
Go Work6 小时前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
深圳智根网络程序开发11 小时前
WordPress固定链接怎么设?改不对谷歌收录直接崩
经验分享
德思特11 小时前
如何提升 5G 移动性切换验证效率?德思特 Amarisoft Callbox 新增 NR SA LTM 测试功能详解
经验分享·无线通信·车载通信
虹科数字化与AR14 小时前
农业机械AR质检ROI怎么算?从搬运、测量、返工和交付成本入手
经验分享·ar·质检·农业机械
聪明的笨猪猪1 天前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
仓库日记2 天前
Excel进销存何时该换?用3项检查判断是否需要软件
经验分享·excel·进销存·开单软件
AI工具挖掘机2 天前
开源!2个Skill复刻带货视频、图文和Live,做百号矩阵
经验分享
虹科网络安全2 天前
Redis Radar:在统一视图中掌握 Redis 部署、健康与容量
经验分享·redis·艾体宝·艾体宝it·艾体宝redis
聪明的笨猪猪2 天前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程