何时以及为什么C链接器会排除未使用的符号?


小蚊子
2025-03-18 12:51:08 (8小时前)


我正在用gcc执行一些测试,以了解智能排除未使用符号的规则。

// main.c

include< stdio.h>

void foo()
{
}

int main(int argc,char * argv [])


2 条回复
  1. 0# v-star*위위 | 2019-08-31 10-32



    最常见的是,静态库链接并不真正具有每个符号的粒度。它具有每成员对象文件粒度。




    例:
    </强>



    如果静态库包含文件:




    1. a.o
      foo
      bar
      b.o
      baz

    2. </code>


    和一个未定义的引用

    foo

    需要解决,

    a.o

    将被带入,并随之而来

    bar

    符号也是。



    使用时,可以获得每个符号粒度的效果

    -ffunction-sections


    -fdata-sections

    然后链接

    -Wl,—gc-sections

    (gc代表垃圾收集),但请记住编译器/链接器选项是特定于gcc / clang的,并且它们具有一些较小的性能/代码大小成本。




    -ffunction-sections

    将每个函数放在它自己的部分(有点像它自己的目标文件)和

    -fdata-sections

    对外部可见的全局变量做同样的事情。

    -Wl,—gc-sections

    然后导致垃圾收集器像往常一样链接目标文件后运行,垃圾收集器删除所有无法访问的部分(=&gt;符号)。





    -ffunction-sections

    如果你想要也很有用

    size -A the_objectfile.o

    给你功能大小,如果你也想要那些功能大小
    根据功能的位置(由于对齐要求)不会略微波动。)


登录 后才能参与评论