Linker LLVM:实现目标代码的链接

Linker LLVM:实现目标代码的链接,linker,llvm,object-code,Linker,Llvm,Object Code,我在追随万花筒。发出目标代码非常简单,但现在我想实现链接步骤,这样我的玩具编程语言就可以直接编译成二进制文件(这样就不需要使用clang)。我如何用LLVM实现这一点?至于“不clangrequired”:LLVM有一个名为LLD的链接器,它是LLVM项目的一部分。根据您安装LLVM的方式,它应该是发行版的一部分 有关LLD以及使用策略,请参阅您的安装版本。然后,您将能够定义您的make或cmake配方 关于你的核心问题,以下是我用自己的语言进行的一般流程: 编译source->output.l

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

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

有关LLD以及使用策略,请参阅您的安装版本。然后,您将能够定义您的
make
cmake
配方

关于你的核心问题,以下是我用自己的语言进行的一般流程:

  • 编译source->output.ll(LLVM程序集)
  • 优化assembly->output.oll(使用
    opt
  • 生成目标程序集->输出.s
  • 组装到对象(使用
    as
    )->output.o
  • 链接(我使用的是
    clang
    ,但这可以与
    lld
    交换)

  • 我对想要什么有点困惑。你指的是教程的一部分吗?此外,您还写道“no
    clang
    usage”应该是必要的,但随后您会问如何“使用LLVM实现这一点”。怎么回事?非常感谢你的回答,弗兰克!你的语言在github上吗,这样我就可以看看源代码了?我试着看一下clang,但即使找到主要功能也是一个挑战;-)另外-optimizeassembly是指运行优化过程,如这里所述()。并生成目标程序集-这是目标代码生成()吗?在那之后,我将从我的编译器进程中调用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)