gpt4 book ai didi

llvm - 发出 LLVM 目标文件后如何运行链接器

转载 作者:行者123 更新时间:2023-12-04 09:57:48 27 4
gpt4 key购买 nike

我编写了一个简单的玩具语言编译器前端,它使用 llvm-sys 生成 LLVM IR (LLVM 的 C library 的 Rust 绑定(bind))。然后我通过创建 LLVMTargetMachine 生成了一个目标文件。基于机器的目标三元组然后调用 LLVMTargetMachineEmitToFile ,成功生成可执行文件。但是,运行可执行文件会产生 zsh: exec format error: ./a.out .

我发现我必须运行 ld -lSystem ./a.out在生成可执行文件以使其工作之后。我应该如何在代码中自动调用链接器?

目前在 macOS Catalina 上使用 LLVM 9.0。

最佳答案

确实,LLVMTargetMachineEmitToFile生成一个仍需要为 的目标文件链接 - 进入可执行库或共享库。

为此,您需要一个链接器,严格来说,它不是 LLVM 的一部分。 LLVM 的集成链接器在 LLVM IR 上运行,而不是本地机器代码。

然而,就像有一个与 LLVM 相关的 C 编译器 Clang 一样,也有一个与 LLVM 相关的本地链接器,称为 LLD。 AFAIK,它可以用作库,因此您可以为编译器注入(inject)集成链接。

值得注意的是, native 编译器遵循“管道”架构,其中编译器本身和链接器(有时也包括汇编器)完全相互分离。在这样的体系结构中,编译器可执行文件(如 clangg++ )实际上是 司机 调用其他程序(cc1,真正的编译器和 ld,链接器)生成最终二进制文件的程序。

关于llvm - 发出 LLVM 目标文件后如何运行链接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61885954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com