如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)

Posted LiuYanYGZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-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。

以上是关于如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)的主要内容,如果未能解决你的问题,请参考以下文章

如何识别IDA反汇编中动态链接库中的函数

VS2019 C++动态链接库的创建使用

Linux静态函数库和动态函数库

Linux静态函数库和动态函数库

gcc找不到静态库中的函数

所以我们需要站在用户的场景去考虑整体的内容