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

时间:2017-08-31 16:14:23

标签: windows assembly llvm nasm llvm-ir

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

原始文件名为code.ll,包含以下代码:

define i32 @main() {
    ret i32 0
}

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

  

llc code.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

现在我想使用此代码创建一个可执行文件,llc doc告诉我这个代码:

  

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

所以我输入nasm(我应该按照我的理解做我想做的事),输入:

  

nasm code.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

由于我对LLVM或汇编程序的经验接近于零,我自己无法解决这个问题。

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

1 个答案:

答案 0 :(得分:-1)

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

问题的原因

有不同种类的汇编语言,它们的语法不同,并且不直接兼容。由于nasm期待的是另一种汇编语言而不是llc正在产生,它显然不起作用,这解释了很长的错误列表。

如何改为

考虑到llc将AT& T汇编程序作为输出(为GNU toolchain创建),最明显的步骤是在构建{GCC后创建可执行文件{1}}文件llc

安装GCC我已下载MinGW,已安装并呼叫

  

mingw-get install gcc

现在我可以通过调用

来访问GCC,这可用于创建code.s
  

gcc code.s -o code.exe

code.exe

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