是否可以从静态库中删除无效代码?

时间:2019-09-12 07:03:35

标签: c linker clang

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

例如:

lib1.c

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

lib2.c

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

new.a(lib1.a + lib2.a)

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

我希望new.a 包含int bar(),因为它在lib1.a的入口点未使用,并且我不打算使用{ {1}}。

这可能吗?

1 个答案:

答案 0 :(得分:0)

如果使用-ffunction-sections(可能还有-fdata-sections)进行编译并与-Wl,--gc-sections链接,则未引用的函数将被删除。这与一开始就没有出现(例如,如果bar包含对其他函数或数据的引用)有细微的不同,这可能会导致包含它们的文件被考虑以供考虑,可能会导致新的全局ctor或覆盖较弱的定义),但对于大多数用途而言足够接近。

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