编译器增量编译实现:对象文件缓存的符号剥离问题
自研编译器增量编译的目标文件缓存清理问题
我正在为自研编译器实现增量编译功能,已经自定义了存储编译函数元数据的文件格式——当源码无变更时,直接读取该文件跳过重复解析与类型检查。我的核心思路是将目标文件(object files)作为缓存单元,每个输入文件对应生成一个目标文件,最终阶段统一链接所有文件。
由于我的语言支持多态函数(polymorphic functions),单个输入文件生成的目标文件中会包含同一函数基于其他模块类型的多个实现。当前遇到的核心问题是:
- 编译大型项目(如编译器自身)后,目标文件会包含所有多态函数的实现;
- 复用该缓存编译简单源码文件时,会引入带有全部函数定义的目标文件,但这些冗余函数的依赖项(如析构函数)在新编译的目标文件链接时已不存在,直接导致链接器报错。
我明确知道需要保留哪些函数,因此计划修改目标文件剥离无用函数,且需要同时支持Windows和Linux平台。我尝试使用项目依赖的llvm-objcopy工具,但测试移除单个符号时出现错误:
llvm-objcopy.exe -N "main::main::([[char]])" .\main.o
llvm-objcopy.exe: error: '.\main.o': '.\main.o': not stripping symbol 'main::main::([[char]])' because it is named in a relocation
我有一个备选方案:为每个主文件编译使用独立缓存,但并不喜欢这种方式;而且该方案仍存在问题——目前我仅能通过clang.exe -nostdlib -Wl,-r,-z,muldefs -o ...向目标文件添加函数(覆盖已有函数),但已经标记为移除的函数仍会残留其中。
内容的提问来源于stack exchange,提问作者Vic
相关产品推荐
相关产品推荐

