c - 是否可以从静态库中删除死代码?
问题描述
我想通过指定入口点从静态库中删除死代码。
例如:
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.a
lib2.a
这可能吗?
解决方案
如果您使用-ffunction-sections
(并且可能-fdata-sections
)编译并使用 链接-Wl,--gc-sections
,则将删除未引用的函数。这与它们一开始不存在略有不同(例如,如果bar
包含对其他函数或数据的引用,则可能导致包含它们的文件被拉入考虑,可能导致新的全局 ctor 或覆盖弱定义)但对于大多数用途来说足够接近。
另一方面,正确的方法是不要定义可以在同一个翻译单元(源文件)中独立使用的函数。将它们拆分为单独的文件,这会自动运行,无需特殊选项。
推荐阅读
- javascript - 如何不断地向 API 发出 GET 请求?
- java - 如何从测试 jar 运行所有单元测试?
- java - 如果一个循环的条件在开始时没有满足,则继续嵌套循环的一部分
- r - 如何获取矩阵列表中每一行的最大值
- django - 将模型属性传递给 Django 中的 URL
- c# - SSIS 包中的 C# 脚本在 SQL Server 表的数据执行过程中挂起,没有明确的错误消息
- javascript - Javascript 隐藏/取消隐藏基于文本框键的 viewbag 项目
- javascript - 如何在单击时在内部插入组件
- c - for() 有什么作用;意思是?这是做什么的;(分号)表示在 c 代码中的 for() 之后而不是 {}?
- java - 使用 Gson 反序列化时跳过级别