關鍵詞:
-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中所有的函數的符號信息。