本篇文章基于mingw32-make.exe来执行编译Cortex-Arm4内核的工程来编写和测试的,环境Windows10 😄
前提准备
- 对Makefile有一定的使用经验,阅读本文章至少要对makefile语法有了解程度
- Windows 下使用 Mingw32-make 来执行 Makefile示例
GCC是什么
具体参数
参数表
参数项 | 功能 | notes |
---|---|---|
-ffunction-sections | 优化 | |
-fdata-sections | 优化 | |
-Wl | 优化 | |
–gc-sections | 优化 | |
-Wall |
参数用例
可执行程序的大小优化
- 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间。这在使用静态库时,体现的更为严重。有时,我们只使用了静态库仅有的几个功能,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加。
- 为了解决前面分析的问题,我们引入了标题中的几个参数。GCC链接操作是以section作为最小的处理单元,只要一个section中的某个符号被引用,该section就会被加入到可执行程序中去。因此,GCC在编译时可以使用 -ffunction-sections和 -fdata-sections 将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致。而在链接阶段, -Wl,–gc-sections 指示链接器去掉不用的section(其中-wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小了。
CFLAGS += -ffunction-sections -fdata-sections LDFLAGS += -Wl,--gc-sections all:main.exe main.exe:main.c gcc $(CFLAGS) -c main.c gcc $(LDFLAGS) -o $@ main.o clean: del main.exe main.o