关键词:
-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
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; }
然后执行下面的命令:
利用nm命令可以看到main中的符号信息
可以看到其中只出现了fun1_0的符号信息,并没有出现fun1.c中其他函数的符号信息。
为了对比,我们使用下面的命令,再次生成一次main
再次使用nm命令进行查看:
可以看到其中包含可fun1.c中所有的函数的符号信息。