【问题标题】:LLVM: Implement linking of the object codeLLVM:实现目标代码的链接
【发布时间】:2018-06-11 17:00:32
【问题描述】:

我正在关注万花筒tutorial。发出目标代码非常简单,但现在我想实现链接步骤,以便我的玩具编程语言可以直接编译成二进制文件(因此不需要使用clang)。如何使用 LLVM 实现这一目标?

【问题讨论】:

  • 我对想要什么感到有点困惑。是您所指的教程的this 位吗?此外,您写道“没有clang 使用”应该是必要的,但随后您询问如何“使用 LLVM 实现这一目标”。什么情况?

标签: linker llvm object-code


【解决方案1】:

就“不需要clang”而言:LLVM 有一个名为LLD 的链接器,它是LLVM 项目的一部分。根据您安装 LLVM 的方式,它应该是发行版的一部分。

请参阅您安装的 LLD 版本以及使用策略。然后,您将能够定义您的 makecmake 食谱。

关于您的核心问题,这是我用自己的语言完成的一般制作流程:

  1. 编译源 -> output.ll(LLVM 程序集)
  2. 优化程序集 -> output.oll(使用opt
  3. 生成目标程序集 -> output.s
  4. 组装成对象(使用as)-> output.o
  5. 链接(我使用的是clang,但可以换成lld

【讨论】:

  • 非常感谢您的回答,弗兰克!你的语言在 github 上,所以我可以看看源代码吗?我尝试查看 clang,但即使找到主要功能也是一个挑战;-)
  • 另外 - 优化装配,是运行优化通道,正如这里所解释的 (llvm.org/docs/tutorial/LangImpl04.html#llvm-optimization-passes)。并生成目标程序集 - 那是目标代码生成 (llvm.org/docs/tutorial/LangImpl08.html) 吗?之后我会从我的编译器进程中调用 run lld 或者是否有一些我可以使用的链接 API 是等效的?
  • 这将是等效的(re; opt)。我单独比较优化的结果与我发出的结果(我不使用 C++ LLVM API)。另外,我忘记了在链接之前组装output.s 文件的步骤“3.5”。对我来说,lld 链接步骤是在 API 调用之外完成的。更新了答案以包含忘记的步骤。
  • 我的语言还没有为 github public 做好准备,而且编译器是自托管的,所以你需要了解它的语法或对函数式编程语言有一般的了解。
  • @YurySolovyov 我认为这是可能的,在 lld 链接器中有一个 CMakeLists.txt,所以你必须将它与你的代码链接,并包含它的标题。但是关于如何使用它的文档不存在或非常少。我认为这个功能非常重要:elf::link(args, exitEarly, stdoutOS, stderrOS)
猜你喜欢
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2011-05-24
  • 2019-08-30
  • 2010-12-06
相关资源
最近更新 更多