我正在用gcc执行一些测试,以了解智能排除未使用符号的规则。
// main.c
void foo(){}
int main(int argc,char * argv [])…
最常见的是,静态库链接并不真正具有每个符号的粒度。它具有每成员对象文件粒度。
的 例: 强>
如果静态库包含文件:
a.o foo bar b.o baz
和一个未定义的引用 foo 需要解决, a.o 将被带入,并随之而来 bar 符号也是。
foo
a.o
bar
使用时,可以获得每个符号粒度的效果 -ffunction-sections -fdata-sections 然后链接 -Wl,--gc-sections (gc代表垃圾收集),但请记住编译器/链接器选项是特定于gcc / clang的,并且它们具有一些较小的性能/代码大小成本。
-ffunction-sections
-fdata-sections
-Wl,--gc-sections
-ffunction-sections 将每个函数放在它自己的部分(有点像它自己的目标文件)和 -fdata-sections 对外部可见的全局变量做同样的事情。 -Wl,--gc-sections 然后导致垃圾收集器像往常一样链接目标文件后运行,垃圾收集器删除所有无法访问的部分(=>符号)。
( -ffunction-sections 如果你想要也很有用 size -A the_objectfile.o 给你功能大小,如果你也想要那些功能大小 根据功能的位置(由于对齐要求)不会略微波动。)
size -A the_objectfile.o