如何讓靜態庫中的可執行程序不調用的函數不鏈接進該可執行程序?(-ffunction-sections -Wl,--gc-sections)


如何讓靜態庫中的可執行程序不調用的函數不鏈接進該可執行程序?(-ffunction-sections -Wl,--gc-sections)

 

關鍵詞:

-Wl,--gc-sections   -ffunction-sections  鏈接  elf   庫

 

有時我們會遇到這種情況,可執行程序需要鏈接一些靜態庫,但是靜態庫中的函數並沒有全部使用,只用了其中的幾個,但是系統默認會自動把整個靜態庫全部鏈接到可執行程序中,造成可執行程序的大小大大增加,浪費了flash空間和內存空間。gcc為我們提供的解決這個問題的方法。

請看下面的例子:

image

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中的符號信息

image

可以看到其中只出現了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命令進行查看:

image

可以看到其中包含可fun1.c中所有的函數的符號信息。

 

gcc的-ffunction-sections和-fdata-sections選項ld的--gc-sections選項  

2011-05-13 14:30:01|  分類: toolchain|舉報|字號 訂閱

 
 
-ffunction-sections, -fdata-sections會使compiler為每個function和data item分配獨立的section。 --gc-sections會使ld刪除沒有被使用的section。
 
鏈接操作以section作為最小的處理單元,只要一個section中有某個符號被引用,該section就會被放入output中。
 
這些選項一起使用會從最終的輸出文件中刪除所有未被使用的function和data, 只包含用到的unction和data。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM