【发布时间】:2019-09-12 07:03:35
【问题描述】:
我想通过指定入口点从静态库中删除死代码。
例如:
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的入口点中没有使用,我不打算直接使用lib2.a。
这可能吗?
【问题讨论】:
-
静态库实际上只不过是目标文件的存档(
.a代表“存档”)。你的libtool命令正在做的是从档案lib1.a和lib2.a中提取目标文件并将它们复制到新的档案new.a。libtool脚本及其运行的命令并没有真正检查(或有可能检查)或修改目标文件本身的内容。要删除未使用的代码,您必须在链接时执行此操作,this old question 显示了如何操作。 -
libtool不会检查库的内容来识别未使用的函数,因为它的工作前提是new.a应该导出与lib1.a和lib2.a相同的函数。您需要手动从lib1.c中删除有问题的函数,重建lib1.a,然后重新创建new.a。