zoukankan      html  css  js  c++  java
  • 如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-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 	functionname = %s
    ", __FILE__ , __FUNCTION__);
    }
    
    
    void fun1_1(void)
    {
    
        printf("filename: %s 	functionname = %s
    ", __FILE__ , __FUNCTION__);
    }
    
    
    void fun1_2(void)
    {
    
        printf("filename: %s 	functionname = %s
    ", __FILE__ , __FUNCTION__);
    }
    
    void fun1_3(void)
    {
    
        printf("filename: %s 	functionname = %s
    ", __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	func:%s
    ", __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中所有的函数的符号信息。

  • 相关阅读:
    MySQL 操作命令梳理(5)-执行sql语句查询即mysql状态说明
    MySQL 主从同步(5)-同步延迟状态考量(seconds_behind_master和pt-heartbea)
    MySQL 操作命令梳理(4)-中文乱码问题
    WebAssembly 介绍
    Android MVP
    Android Data Binding(数据绑定)用户指南
    认知心理学告诉你什么才是高效学习
    Android O新特性和行为变更总结zz
    音视频不同步问题的原因和解决方案
    当程序员写不出代码了,该怎么办?
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3471857.html
Copyright © 2011-2022 走看看