如何从 LLVM ir 创建可执行文件?

lnc*_*ncr 7 windows assembly nasm llvm llvm-ir

我目前正在使用llc.ll文件转换为.s使用命令行的文件。然后我想获取这个文件,然后使用nasm从它创建一个可执行文件。虽然第一步似乎工作正常,但我无法让第二步工作。


原始文件被调用code.ll并包含以下代码:

define i32 @main() {
    ret i32 0
}
Run Code Online (Sandbox Code Playgroud)

现在我使用 cmd.s通过键入以下内容来构建文件:

有限责任公司代码.ll

这工作正常并创建一个code.s包含以下代码的文件:

    .def     @feat.00;
    .scl    3;
    .type   0;
    .endef
    .globl  @feat.00
@feat.00 = 1
    .def     _main;
    .scl    2;
    .type   32;
    .endef
    .text
    .globl  _main
    .align  16, 0x90
_main:                                  # @main
# BB#0:
    xorl    %eax, %eax
    ret
Run Code Online (Sandbox Code Playgroud)

现在我想使用这段代码创建一个可执行文件,关于它的llc 文档告诉我:

然后,汇编语言输出可以通过本机汇编器和链接器来生成本机可执行文件。

因此,我 通过键入以下内容使用nasm(据我所知,它应该可以满足我的要求):

nasm 代码.s

这会产生以下错误列表:

code.s:1: error: attempt to define a local label before any non-local labels
code.s:1: error: parser: instruction expected
code.s:2: error: attempt to define a local label before any non-local labels
code.s:2: error: parser: instruction expected
code.s:3: error: attempt to define a local label before any non-local labels
code.s:3: error: parser: instruction expected
code.s:4: error: attempt to define a local label before any non-local labels
code.s:5: error: attempt to define a local label before any non-local labels
code.s:5: error: parser: instruction expected
code.s:6: error: parser: instruction expected
code.s:7: error: parser: instruction expected
code.s:8: error: parser: instruction expected
code.s:9: error: parser: instruction expected
code.s:12: error: parser: instruction expected
code.s:13: error: parser: instruction expected
code.s:14: error: parser: instruction expected
BB#0::1: error: parser: instruction expected
BB#0::2: error: parser: instruction expected
BB#0::3: error: parser: instruction expected
BB#0::4: error: parser: instruction expected
BB#0::5: error: parser: instruction expected
BB#0::8: error: parser: instruction expected
BB#0::9: error: parser: instruction expected
BB#0::10: error: parser: instruction expected
Run Code Online (Sandbox Code Playgroud)

由于我在 LLVM 或汇编器方面的经验接近于零,我无法自己解决这个问题。

如果我遗漏了一些重要的东西,请告诉我,我会尽快编辑我的答案。

lnc*_*ncr 4

感谢@Michael Petch@Ross Ridge的评论,我终于明白了为什么这不起作用并找到了一个可行的替代方案。


问题的原因

汇编语言有多种,其语法各不相同,并且不直接兼容。由于nasm期望使用llc生成的另一种汇编语言,因此它显然不起作用,这解释了一长串错误。

该怎么做呢

考虑到llc具有 AT&T 汇编器作为输出,该汇编器是为GNU 工具链创建的,最明显的步骤是在使用llc构建文件后使用GCC创建可执行文件。code.s

为了安装GCC我下载了MinGW,安装了它并调用

mingw-get 安装 gcc

现在我可以访问GCC,它可以code.exe通过调用来创建

gcc代码.s -o代码.exe

gcc [filename] -o [name of the created executable]


由于这个解决方案可能比需要的更复杂,我很高兴看到一些替代方案/改进。

  • 如果你有“llvm”,你不是已经有“clang”了吗?这将节省您添加 YATC(另一个工具链)的麻烦。 (2认同)