从 LLD 中移除全局状态

主要观点:LLD 是成熟快速的链接器,支持多种二进制格式,但代码依赖全局状态,不利于库集成,存在致命错误和全局变量冲突等问题。虽有将其作为库调用的需求,但建议仍以单独进程调用。同时 LLD 一直在减少对全局变量的依赖,将全局变量迁移到Ctx类中,添加Ctx &ctx参数等,以提升可集成性和代码维护性,且已在lld/ELF部分取得进展,lld/Common部分仍需大量工作,LLD 还利用了 LLVM 的全局状态等。

关键信息

  • LLD 支持多种二进制格式,代码依赖全局状态,存在致命错误和全局变量冲突。
  • 为减少全局变量依赖,进行了一系列迁移和修改,如将全局变量迁移到Ctx类、添加Ctx &ctx参数等。
  • 已在lld/ELF部分取得进展,lld/Common部分仍需工作。
  • LLD 利用 LLVM 的全局状态,如cl::optManagedStatic,且某些操作仍需注意。
  • 可多次调用lld::lldMain,但在某些情况下需注意安全性。

重要细节

  • 2020 年解决了大部分致命错误场景,利用llvm::sys::Process::Exit等。
  • 全局变量在lld/ELF中的具体分布情况。
  • 2020 年起 LLD 不断进行改造以减少全局变量依赖,如在不同年份对lld/Common等部分的修改。
  • 引入Ctx类并进行相关修改,如在Config.hDriver.cpp中的改动。
  • 2024 年继续推进相关工作,如将更多变量移入Ctx等。
  • lld/Common中用上下文感知的 API 替代全局状态相关的函数。
  • LTO 链接作业利用 LLVM 全局状态,某些操作需注意。
  • 可多次运行lld-link,但仅最后一次输出诊断信息等。
阅读 20
0 条评论