【发布时间】:2017-03-29 20:51:18
【问题描述】:
在一个包含多个静态链接对象文件的项目中,我将其中一个替换为单独的实现。我想在实现替换的目标文件提供的每个符号之前测试我的代码,所以我使用-Wl,--unresolved-symbols=ignore-all 让链接器不会抱怨丢失的符号。
但是当我测试代码时,它在尝试使用未定义的符号之一时会崩溃。因此,我正在寻找一种方法来告诉链接器“请在链接之前删除所有未引用的代码,然后告诉我在从入口点可到达的代码中是否还有未引用的符号”。这可能吗?
【问题讨论】:
-
目标文件是从生成的 LLVM IR(而不是 C 代码)生成的,如果这有区别的话。
-
通过 opt 传递 IR 就足够了吗?听起来像deadstriping然后正常链接就可以了
-
不,我不认为
opt有帮助,因为opt一次只查看一个模块,对吧? -
我正在考虑使用 llvm-link 将各种 IR 放在一起,然后选择(尤其是 -dce、-globaldce)进行剥离。将 IR 转换为目标代码。然后链接器获取一个文件,并且仍然会警告任何实际可访问的符号。
-
嗯,这可能可行,但很难集成到现有的构建系统中(在最终链接之前将每个
.ll编译为.o文件)。
标签: linker undefined-symbol dead-code link-time-optimization