如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)
如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)
关键词:
-Wl,--gc-sections -ffunction-sections 链接 elf 库
有时我们会遇到这种情况,可执行程序需要链接一些静态库,但是静态库中的函数并没有全部使用,只用了其中的几个,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加,浪费了flash空间和内存空间。gcc为我们提供的解决这个问题的方法。
请看下面的例子:
fun1.c
#include <stdio.h> void fun1_0(void) { printf("filename: %s \tfunctionname = %s\n", __FILE__ , __FUNCTION__); } void fun1_1(void) { printf("filename: %s \tfunctionname = %s\n", __FILE__ , __FUNCTION__); } void fun1_2(void) { printf("filename: %s \tfunctionname = %s\n", __FILE__ , __FUNCTION__); } void fun1_3(void) { printf("filename: %s \tfunctionname = %s\n", __FILE__ , __FUNCTION__); }
fun1.h
extern void fun1_0(void);
main.c
#include <stdio.h> #include "fun1.h" int main(int argc, const char *argv[]) { fun1_0(); printf("file:%s\tfunc:%s\n", __FILE__, __FUNCTION__); return 0; }
然后执行下面的命令:
gcc -c -ffunction-sections fun1.c
ar -r libfun1.a fun1.o
gcc -c -ffunction-sections main.c
gcc main.o -L. -I. libfun1.a -Wl,--gc-sections -o main 或者 gcc main.o -L. -I. -lfun1 -Wl,--gc-sections -o main
利用nm命令可以看到main中的符号信息
可以看到其中只出现了fun1_0的符号信息,并没有出现fun1.c中其他函数的符号信息。
为了对比,我们使用下面的命令,再次生成一次main
gcc -c fun1.c
ar -r libfun1.a fun1.o
gcc -c main.c
gcc main.o -L. -I. libfun1.a -o main 或者 gcc main.o -L. -I. -lfun1 -o main
再次使用nm命令进行查看:
可以看到其中包含可fun1.c中所有的函数的符号信息。
gcc的-ffunction-sections和-fdata-sections选项与ld的--gc-sections选项
-ffunction-sections, -fdata-sections会使compiler为每个function和data item分配独立的section。 --gc-sections会使ld删除没有被使用的section。
链接操作以section作为最小的处理单元,只要一个section中有某个符号被引用,该section就会被放入output中。
这些选项一起使用会从最终的输出文件中删除所有未被使用的function和data, 只包含用到的unction和data。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)