首页 > 解决方案 > 是否可以从静态库中删除死代码?

问题描述

我想通过指定入口点从静态库中删除死代码。

例如:

lib1.c

int foo() { return 0; }
int bar() { return 0; }

lib2.c

#include "lib1.h"
int entry() {
    return foo();
}

新的.a (lib1.a + lib2.a)

libtool -static -o new.a lib1.a lib2.a

new.a不想包含,因为它在 的入口点中未使用并且我不打算直接使用。int bar()lib1.alib2.a

这可能吗?

标签: clinkerclang

解决方案


如果您使用-ffunction-sections(并且可能-fdata-sections)编译并使用 链接-Wl,--gc-sections,则将删除未引用的函数。这与它们一开始不存在略有不同(例如,如果bar包含对其他函数或数据的引用,则可能导致包含它们的文件被拉入考虑,可能导致新的全局 ctor 或覆盖弱定义)但对于大多数用途来说足够接近。

另一方面,正确的方法是不要定义可以在同一个翻译单元(源文件)中独立使用的函数。将它们拆分为单独的文件,这会自动运行,无需特殊选项。


推荐阅读